C++ 正则表达式

发布时间 2023-11-30 22:01:56作者: 雨和风

C++ 正则表达式


正则表达式处理的是文本。这可能是一个字符串对象,也可能是一个文本文件,或者是一堆日志。

匹配:regex_match()

匹配是判断给定的字符串是否符合某个正则表达式,所以匹配的特性是完全匹配。例如:判断文本是否全部由数字构成:

regex ex("\\d+"); 			//表达式需先使用 '\'转义,否则 ’\d’会被视为字面量
string s1 = “dadw12411”;
cout<< regex_match(s1,ex);	// 结果返回1

另一种版本,使用 smatchcmatch (类似于string 和 **const char ***)

regex ex("\\d+");
string s1 = "dadw12411";
string s2 = "3124511";

smatch m1,m2;			//m1,m2用于保存匹配的结果
regex_match(s1,m1,ex);	//使用提供的模板函数
regex_match(s2,m2,ex);

//可以使用内部封装好的迭代器 或者 使用下标遍历的方式遍历
for(auto it = m1.begin();it != m1.end();++it){
    cout<< *it <<" ";			//多次空打印,既无结果
}
for(auto it = m2.begin();it != m2.end();++it){
    cout<< *it <<" ";			//打印出3124511,只打印一次,结果存放在m[0]处
}

类似于匹配,但是非完全匹配,只要目标字符出现,既会返回。

regex ex("\\d+");
string s2 = "dwaf123gad521";
smatch match;				
regex_search(s2,match,ex);	
cout<<match[0]				//结果保存至match中

替换:regex_replace()

替换完全匹配表达式的部分,不会改变原字符串,函数返回一个新字符串。

regex ex("\\d+");
string s1 = "ad142451ge123";
string s2 = regex_replace(s1,ex,"what is this");
cout<<s2<<" ";			//输出:adwhat is this gewhat is this

此外,类似于 \\d+ 这样的表达式,我们可以看作成一个变量,符号为$n (n可以看出出现的位置,位置从1开始算起)

所以文本就可以被变量分割:

regex ex("(\\d+)-(\\w+)");	// “数字-字符"的文本格式
string s = “0001-Neo,0002-lucia”;
cout<< regex_replace(s,ex,"$1 name= $2");	//输出:0001 name= Neo,0002 name= lucia

分词:sregex_token_iterator()

将遇到的表达式作为分割标示符,遇见一个,分割一次。

std::string mail("123@qq.vip.com,456@gmail.com,789@163.com,abcd@my.com");
std::regex reg(",");
std::sregex_token_iterator pos(mail.begin(), mail.end(), reg, -1);	//迭代器做参数
decltype(pos) end;													//返回也是迭代器
for (; pos != end; ++pos)
{
	std::cout << pos->str() << std::endl;
}
//输出:	123@qq.vip.com
//		 456@gmail.com
//		 789@163.com
//		 abcd@my.com


补充:

当我们需要一个类似于"\w\w\w\\w\\w\w\w\w\\\w\w\w\w\\\w",有很多反斜杠的字符串,并且不需要转义时,我们应该采用**Raw string literal **来表示,将内部的内容视为纯字符。如:

//格式为: R"(content)",content即使需要的字符串本身
string s = R"(\\w\w\\w\\\w\\\w\w\w\w\\\\\w\\w\w\w\\\\\w)";
cout<<s;	//输出:\\w\w\\w\\\w\\\w\w\w\w\\\\\w\\w\w\w\\\\\w

符号介绍:

regex1

regex3regex2


参考文献:

1.https://www.eet-china.com/mp/a81491.html

2.https://www.cnblogs.com/coolcpp/p/cpp-regex.html