C++ regex库匹配任意字符的方法

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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值