c++正则表达式总结

在我的项目开发生涯中,许多地方都用到了正则表达式,每种语言的都尝试过。而C++的正则表达式相比其他语言的用法要复杂一些,尤其比perl复杂的的多,但是万变不离其宗,其本质内容还是保持一致的,下面介绍一下C++正则表达式的结构:
正则表达式结构按字符串宽窄和常量非常量可以分为四族:

  • string    regex、smatch、ssub_match 、sregex_iterator
  • const char* regex、cmatch、csub_match、cregex_iterator
  • wstring    wregex、wsmatch、wssub_match、wsregex_iterator
  • const wchar_t* wregex、wcmatch、wcsub_match、wcregex_iterator
    每族的区别只有名字不同,用法是相同的,因此本文只介绍第一族的,其余的各位自行领会。

1.正则范式
regex类型,用法

string str("a*");
regex r(str)

r是一个正则范式,初始化接受一个string对象。注意,是先构造string,然后再将string传给regex对象,所以对于string里的特殊字符–双引号,单引号,转义字符–需要进行转义处理。

string s1("\"");
regex r1(s1);//相当于构造了一个/"/正则表达式
string s2("\\'");
regex r2(s2)//相当于构造了一个/'/正则表达式
string s3("\\n");
regex r3(s3)//相当于构造了一个/\n/正则表达式

2.匹配函数
regex_match,匹配指定字符串完整序列是否与正则表达式匹配,匹配返回true否则返回false。
regex_search,匹配指定字符串内是否包含与正则表达式匹配的子序列,匹配则返回true,否则返回false。
regex_replace,将指定字符串中与正则表达式匹配的子序列进行替换,返回值为替换后的字符串。
还有个小插曲sregex_iterator
这些都稍后讲
3.存储容器
smatch类型,用法

string str;
regex r(str);
smatch result;
regex_search(str,result,r);
cout<<result.str():

smatch用于存储匹配到的内容,它的str()成员函数可将内容以字符串形式输出。
正则的运用
1.bool regex_match(seq,m,r,mft)
seq:要匹配的字符串
m:匹配到的内容保存的容器,smatch类型。
r:regex对象,要匹配的内容的格式。
mft:匹配时采用的一些细节方式,可省略,这个不在本文讲解,有意者可自行百度。
本函数就是让一个字符串从头到尾与一个正则表达式匹配,若有一点不匹配就返回false,否则返回true,下面给出实例:

string str="niulei2";

string pattern("[A-z]*");
regex r(pattern);
smatch result;
bool flag=regex_match(str,result,r);
cout<<boolalpha<<flag;//结果是false;

一言以蔽之,regex_match函数要求被匹配字符串与正则表达式完全匹配。
2.bool regex_search(seq,m,r,mft)
参数意义与regex_match一致。
该函数的功能是搜索在指定字符串中是否有指定与正则表达式匹配的子序列,实例:

string str="niulei2";

string pattern("[A-z]*");
regex r(pattern);
smatch result;
bool flag=regex_match(str,result,r);
cout<<boolalpha<<flag;//结果是true;
cout<<result.str();//结果是"niulei"

3.string regex_replace(dest,seq,r,fmt,mft)
其中seq是被替换字符串,r是正则表达式,mft为控制信息可有可无。dest是替换后的字符串存储位置,是string::iterator类型,如果缺省则视为保存在被替换符串中。最重要的是fmt,它决定了替换后的字符串按什么样的格式存储,下面给出实例:

string seq="2017-6-23";
string fmt="\$2.\$3.\$1";
string pattern="(\\d*)-(\\d*)-(\\d*)";
regex r(pattern);
string result;
string::iterator iter=result.begin();
regex_replace(iter,seq,r,fmt);
cout<<result;//结果是6.23.2017

4.sregex_iterator
这是一种正则表达式迭代器,可以看作regex库给我们的额外福利,它类似于STL提供给我们的insert_iterator,后者是对insert操作进行了封装,让我们对插入迭代器进行简答的赋值、自增等运算就能实现想要的插入操作。那么sregex_iterator也是如此,对regex_search操作进行了封装,它使用方法如下:

string seq;
auto b=seq.begin():
auto e=seq.end();
regex r;
sregex_iterator it(b,e,r);

b和e为string::iterator,r为正则表达式。这就绑定了r和与seq。初始化it的时候会对seq进行一次regex_search,通过++it或者it++可实现对seq的循环regex_search,匹配的结果保存在*it中,*it为smatch类型,因此可通过it->str()来查看匹配结果,另外它还重载了==和!=操作符,可通过这两个操作符判断两个sregex_iterator是否相等,如it1==it2,it1!=it2;
下面给出实例:

string names="Ross Rachel Monica Joey Chandller Phoebe";
string pattern("[[:alpha:]]*");\\这就相当于[a-z A-Z]*,之前嫌麻烦一直没写
regex r(pattern);
sregex_iterator it(names.begin(),names.end(),r);
sregex_iterator end_it;//空的,相当于结束符
for(;it!=end_it;++it)
    cout<<it->str();<<endl;//输出六个可爱的名字

如上,sregex_iterator迭代器将regex_search运用变得如此轻巧灵便,实在是一个令人喜欢的工具。

猜你喜欢

转载自blog.csdn.net/qq_36946274/article/details/80758997