C++ regex库匹配任意字符
开门见山:
方法:用 “(\n|.)” 来取代 “.”
c++使用正则语言,需要添加头文件:
#include<regex>
regex库,与其他语言不同的是:要匹配任意字符,“.” 符号是不行的,它匹配除 “\n” 换行符之外的任意字符,因此,想要匹配任意字符,需要用 “(\n|.)” 来取代 “.”
现在进行3组测试。
首先,头文件和一个函数:
#include<iostream>
#include<regex>
using namespace std;
//根据输入的模板pattern对字符串str进行分割,分割
void SplitStrByRegex(const string& str, const string& pattern)
{
regex reg(pattern); //模板
sregex_iterator pos(str.begin(), str.end(), reg); //迭代器,在str中匹配
sregex_iterator end;
cout << "+++++++++++++++++pattrn+++++++++++++++" << endl;
int i = 0;
for (; pos != end; pos++) { //迭代器,输出在str中匹配结果
cout << "[" << i << "] : " << pos->str(1) << endl; //匹配到第一个括号内的内容
//cout << "[" << i << "] : " << pos->str(0) << endl; //匹配到模板全部内容
i++;
}
cout << "-----------------pattrn---------------" << endl;
}
现在,主函数进行三组测试:
测试0:
这里只匹配一个,用"<a>(.*?)</a>" 为模板,匹配<a>和</a>之间的任意字符
int main()
{
string pattern = "<a>(.*?)</a>"; //模板
cout << "测试0,1个匹配:" << endl;
string str = "<a>Hello world!</a>";
SplitStrByRegex(str, pattern);
}
输出确实输出了一个,且没有问题:
测试1
模板不改变,只是添加了一个可以匹配项
cout << "\n测试1,2个匹配:" << endl;
pattern = "<a>(.*?)</a>"; //模板
string str1 = "<a>Hello world! 0000</a>\n<a>Hello world! 1111</a>";
SplitStrByRegex(str1, pattern);
这里匹配没有任何问题
测试2
模板不改变,但是,第一个匹配项内部添加 “\n” 换行符
cout << "\n测试2,1个匹配(本该匹配的内容中加入换行符\\n):" << endl;
pattern = "<a>(.*?)</a>"; //模板
string str2 = "<a>Hello world! 0000</a>\n<a>Hello world! \n 1111</a>";
SplitStrByRegex(str2, pattern);
可以看到现在只有一个匹配了,而另一个匹配项中因为加了换行符而不成功。
由此证明,c++的regex库的 “.” 不能匹配 "\n”
测试4 用"(\n|.)" 来取代 “.”,成功匹配任意字符
修改模板,用"(\n|.)" 来取代 “.”
cout << "\n测试3,1个匹配(本该匹配的内容中加入换行符\\n,同时改变pattern):" << endl;
pattern = "<a>((.|\n)*?)</a>"; //模板
string str3 = "<a>Hello world! 0000</a>\n<a>Hello world! \n 1111</a>";
SplitStrByRegex(str3, pattern);
输出结果:
这样,就匹配到换行符“\n”了。
由此,证明可行。
完整代码
#include<iostream>
#include<regex>
using namespace std;
//根据输入的模板pattern对字符串str进行分割,分割
void SplitStrByRegex(const string& str, const string& pattern)
{
regex reg(pattern); //模板
sregex_iterator pos(str.begin(), str.end(), reg); //迭代器,在str中匹配
sregex_iterator end;
cout << "+++++++++++++++++pattrn+++++++++++++++" << endl;
int i = 0;
for (; pos != end; pos++) { //迭代器,输出在str中匹配结果
cout << "[" << i << "] : " << pos->str(1) << endl; //匹配到第一个括号内的内容
//cout << "[" << i << "] : " << pos->str(0) << endl; //匹配到模板全部内容
i++;
}
cout << "-----------------pattrn---------------" << endl;
}
int main()
{
string pattern = "<a>(.*?)</a>"; //模板
cout << "测试0,1个匹配:" << endl;
string str = "<a>Hello world!</a>";
SplitStrByRegex(str, pattern);
cout << "\n测试1,2个匹配:" << endl;
pattern = "<a>(.*?)</a>"; //模板
string str1 = "<a>Hello world! 0000</a>\n<a>Hello world! 1111</a>";
SplitStrByRegex(str1, pattern);
cout << "\n测试2,1个匹配(本该匹配的内容中加入换行符\\n):" << endl;
pattern = "<a>(.*?)</a>"; //模板
string str2 = "<a>Hello world! 0000</a>\n<a>Hello world! \n 1111</a>";
SplitStrByRegex(str2, pattern);
cout << "\n测试3,1个匹配(本该匹配的内容中加入换行符\\n,同时改变pattern):" << endl;
pattern = "<a>((.|\n)*?)</a>"; //模板
string str3 = "<a>Hello world! 0000</a>\n<a>Hello world! \n 1111</a>";
SplitStrByRegex(str3, pattern);
return 0;
}