再探正则表达式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的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 上的 URL 正则表达式搜索和替换(在 WordPress 中)