C++中简单使用正则表达式

C++11可以使用正则表达式来解决字符串匹配查找替换问题,加入头文件regex。

1.匹配

bool regex_match(string s,regex pattern)
bool regex_match(string s,smatch result,regex pattern)
bool regex_match(s.cbegin()+i,s.cend(),smatch result,regex pattern)  //从字符串的某个位置开始匹配?

匹配函数只有当模式匹配了整个字符串(或从给定位置开始的字符串),才会返回true。

如果需要保存结果,可以用第二种函数,用smatch result保存结果。
通常result[0]保存整个匹配结果result[i]保存第i个捕获组的匹配结果,即模式中第i个括号的匹配结果。如果没有这样的结果则为空。
可以用result.size()查看一共有多少个匹配结果。

测试:

int main()
{
	regex pattern("([a-zA-Z]{3})_(\\d{4})");
	string s = "sMQ_1998";
	smatch result;
	bool ismatch = regex_match(s, result, pattern);
	if (ismatch)
	{
		cout << "匹配成功:" << result[0] << endl;
		cout << result.size(); 
		for (int i = 1; i <= result.size(); i++)
			cout << result[i] << " " << endl;
	}
	else
		cout << "匹配失败" << endl;
	
	string ss = "1k7zyy_1997";
	bool ismatch2 = regex_match(ss.cbegin() + 3, ss.cend(), result, pattern);  //从第4个字符处开始匹配
	if (ismatch2)
	{
		cout << "匹配成功:" << result[0] << endl;
		cout << result.size();
		for (int i = 1; i <= result.size(); i++)
			cout << result[i] << " " << endl;
	}
	else
		cout << "匹配失败" << endl;
	
	return 0;
}

C++中简单使用正则表达式_第1张图片

2.查找

bool regex_search(string s,regex pattern)
bool regex_search(string s,smatch result,regex pattern)
bool regex_search(s.cbegin()+i,s.cend(),smatch result,regex pattern)  //从字符串的某个位置开始匹配?

搜索给定字符串中是否存在与模式匹配的子串,如果存在则返回true。

同样可以用smatch result记录结果,但不同的是result[0]记录的是整个字符串中从左往右第一个匹配模式的子串。

假如有多个子串符合模式,若想知道result[0]中存储的是第几个子串,可以用result.position()函数,返回数从0开始。

!!!
如果想遍历整个源串,一一匹配所有符合模式的子串,可以用string的迭代器,用resul.second()更新迭代器位置,具体如下
这里注意,smatch[0].first返回的是查找结果子串的在源串中的迭代器位置,second返回的是子串后面的位置。smatch.prefix表示匹配子串在源串的前缀,subfix表示后缀。

regex pattern("\\d+");
	string s = "51x41+(5-13/2)x3";
	smatch result;
	string::const_iterator iter = s.cbegin();
	string::const_iterator iter_end = s.cend();
	while (regex_search(iter, iter_end, result, pattern))
	{
		cout << "查找成功:" << result[0] << endl;
		iter = result[0].second;
	
	}
	return 0;

C++中简单使用正则表达式_第2张图片
测试:

int main()
{
	regex pattern("([a-zA-Z]{3})_(\\d{4})");
	string s = "32sMQ_19988abc_89912";
	smatch result;
	bool ismatch = regex_search(s, result, pattern);
	if (ismatch)
	{
		cout << "查找成功:" << result[0] << endl;
		cout << "结果个数" << result.size() << endl;
		for (int i = 1; i <= result.size(); i++)
			cout << result[i] << " " << endl;
	}
	else
		cout << "查找失败" << endl;
	
	string ss = s;
	bool ismatch2 = regex_search(ss.cbegin() + 11, ss.cend(), result, pattern);  //从abc处开始
	if (ismatch2)
	{
		cout << "查找成功:" << result[0] << endl;
		cout << "结果个数" << result.size() << endl;
		for (int i = 1; i <= result.size(); i++)
			cout << result[i] << " " << endl;
	}
	else
		cout << "查找失败" << endl;
	
	return 0;
}

C++中简单使用正则表达式_第3张图片

3.替换

string regex_replace(string s,regex p,string replace_str)
//有其他重载用法

对字符串s中与模式匹配的所有子串进行相应的字符串替换,替换字符串引用匹配子串中的内容,引用方法如下:
C++中简单使用正则表达式_第4张图片(此处参考:https://blog.csdn.net/u011475134/article/details/76167980 @SigalHu)
(这里有点奇怪的是假如源串中有多个匹配模式的子串,$`对于第二个子串,不会引用它在源串中左边的所有部分,只引用了从源串中上一个匹配子串右边到它自己左边的部分;而$'则不会出现这种情况,它会引用自己在源串位置后面的所有内容。具体参看测试)

另外,可以用$n来调整字符串的顺序!

int main()
{
	regex pattern("[a-zA-Z]{3}");
	string s = "32sMQ_19988abc_199912",ss;
	ss=regex_replace(s, pattern, "-ops-");
	cout << ss << endl;

	ss= regex_replace(s, pattern, "-ops$$-");
	cout << ss << endl;

	ss = regex_replace(s, pattern, "-ops$&-");  //$&表示整个匹配子串
	cout << ss << endl;

	ss = regex_replace(s, pattern, "-ops$`-");  //$`表示源串中整个匹配子串左侧内容(从上一个匹配子串右侧到自己左侧)
	cout << ss << endl;

	ss = regex_replace(s, pattern, "-ops$'-");  //$`表示源串中整个匹配子串右侧内容 (整个右侧内容)
	cout << ss << endl <

C++中简单使用正则表达式_第5张图片

4.其他更牛逼的用法等需要用的时候再学吧 ?

你可能感兴趣的:(19年复习知识点)