再探正则表达式c++-html中搜索url

Posted qianbo_insist

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了再探正则表达式c++-html中搜索url相关的知识,希望对你有一定的参考价值。

正则基础

字符

[a-z]    // 匹配所有的小写字母
[A-Z]    // 匹配所有的大写字母
[a-zA-Z]   // 匹配所有的字母
[0-9]      // 匹配所有的数字
[0-9\\.\\-]      // 匹配所有的数字、句号、减号
[ \\n\\f\\r\\t\\v]  // 匹配所有的空白字符(空格、换行符、换页符、回车符、水平制表符、垂直制表符)

数字

^[0-9]{1,}$           // 匹配所有的正数
^[0-9]+$              // +与{1,}相等,表示前面的内容可以是1个或多个
^\\-{0,1}[0-9]{1,}$    // 匹配所有的整数
^\\-?[0-9]+$           
^\\-{0,1}[0-9]{0,}\\.{0,1}[0-9]{0,}$  // 匹配所有小数的正则
^\\-?[0-9]{0,}\\.?[0-9]{0,}$    // ?与{0,1}相等,表示前面的内容是可选的
^\\-?[0-9]*\\.?[0-9]*$          // *与{0,}相等,表示前面的内容可以是0个或多个

c++ regex

c++ regex 可以使用多种方式,std::regex_match,std::regex_search,使用这两种方式都很方便
,我们下面使用多种方式来做匹配,最后使用search 来搜索网页中的url

#include <iostream>
#include <string>
#include <memory>
#include <regex>
using namespace std;
int main()
{
	// 简单正则表达式匹配
	std::string fnames[] = { "addc<li data><a href=\\"https://blog.csdn.net/qianbo04231/category_abc.html\\"></li>abdd", 
		"dddddddddddddddd<a href=\\"\\">链接</a>", 
		"aaa.html", 
		"dd adf aaa.png" };
	std::regex html_regex("[a-z]+\\\\.html");

	for (const auto &fname : fnames) {
		std::cout << fname << ": " << std::regex_match(fname, html_regex) << '\\n';
	}

	// 提取子匹配
	std::regex base_regex("([a-z]+)\\\\.png");
	
	std::smatch base_match;

	for (const auto &fname : fnames) {
		if (std::regex_match(fname, base_match, base_regex)) {
			// 首个 sub_match 是整个字符串;下个
			// sub_match 是首个有括号表达式。
			if (base_match.size() == 2) {
				std::ssub_match base_sub_match = base_match[1];
				std::string base = base_sub_match.str();
				std::cout << fname << " has a base of " << base << '\\n';
			}
		}
	}

	// 提取几个子匹配
	std::regex pieces_regex("([a-z]+)\\\\.([a-z]+)");
	std::smatch pieces_match;

	for (const auto &fname : fnames) {
		if (std::regex_match(fname, pieces_match, pieces_regex)) {
			std::cout << fname << '\\n';
			for (size_t i = 0; i < pieces_match.size(); ++i) {
				std::ssub_match sub_match = pieces_match[i];
				std::string piece = sub_match.str();
				std::cout << "  submatch " << i << ": " << piece << '\\n';
			}
		}
	}

	std::smatch url_match;
	std::regex url_regex("<a href=\\"([^>]+)\\">",std::regex::icase);
	for (const auto &fname : fnames) {

		if (std::regex_search(fname, url_match, url_regex)) {
			for (size_t i = 0; i < url_match.size(); ++i) {
				std::ssub_match sub_match = url_match[i];
				std::string url= sub_match.str();
				std::cout << "  urlmatch " << i << ": " << url << '\\n';
			}
		}

	}
	getchar();
}

结果

addc<li data><a href="https://blog.csdn.net/qianbo04231/category_abc.html"></li>abdd: 0
dddddddddddddddd<a href="">链接</a>: 0
aaa.html: 1
dd adf aaa.png: 0
aaa.html
  submatch 0: aaa.html
  submatch 1: aaa
  submatch 2: html
  urlmatch 0: <a href="https://blog.csdn.net/qianbo04231/category_abc.html">
  urlmatch 1: https://blog.csdn.net/qianbo04231/category_abc.html

以上是关于再探正则表达式c++-html中搜索url的主要内容,如果未能解决你的问题,请参考以下文章

java匹配url的正则表达式

MySQL 上的 URL 正则表达式搜索和替换(在 WordPress 中)

python 正则表达式

从给定字符串中提取 url 的 C# 正则表达式模式 - 不是完整的 html url,而是裸链接

Javascript 清理 URL 正则表达式

正则表达式搜索+替换 href="URL"