前言
正则表达式是在字符串处理中常用和重要的工具,主要用于字符串的匹配。在C#中正则表达式的使用非常方便,但到了C++中让我有点懵逼了,花了些时间查阅了很多资料,下面主要会写到C++中正则表达式常用到的三个方法(全文匹配、搜索和替换)的作用以及区别。
本篇博客不涉及正则表达式语法的基本内容,如果你对正则表达式不了解,可以访问这个链接获得帮助。
文章目录
- 前言
- 1 转义字符
- 2 regex_match
-
- 3 regex_search
-
- 4 regex_replace
-
- 5 匹配忽略大小写
- 6 帮助网站
1 转义字符
在讲具体方法之前,我们先了解下C++中使用正则表达式需要注意的一个问题:转义字符
cout << regex_match("123", regex("\d+")) << endl; //结果为0,需要转义字符'\'
cout << regex_match("123", regex("\\d+")) << endl; //结果为1,完全匹配
C++中必须要对表达式中的’'进行转义,为什么?
2 regex_match
2.1 基本概念
match是全文匹配,即要求整个字符串符合匹配规则。
cout << regex_match("123", regex("\\d")) << endl;
cout << regex_match("123", regex("\\d+")) << endl;
上述方法返回值为bool值,主要用于if条件表达式中。
2.2 匹配结果
更多的时候我们希望能够获得匹配结果(字符串),对结果进行操作。这时就需要对匹配结果进行存储,共有两种存储方式。
match_results<string::const_iterator> result;
smatch result;
第二种方式使用起来更简洁、方便,推荐使用。
2.3 实例
下面看一个match方法匹配的实例,看看实际应用:
string str = "Hello_2018";
smatch result;
regex pattern("(.{5})_(\\d{4})");
if (regex_match(str, result, pattern))
{
cout << result[0] << endl;
cout << result[1] << endl;
cout << result[2] << endl;
cout<<"结果显示形式2"<<endl;
cout<< result.str() << endl;
cout<< result.str(1) << endl;
cout << result.str(2) << endl;
}
for (int i = 0; i < result.size(); ++i)
{
cout << result[i] << endl;
}
result[]与result.str()这两种方式能够获得相同的值,我更喜欢用数组形式的。
在匹配规则中,以括号()的方式来划分组别,实例中的规则共有两个括号,所以共有两组数据。
3 regex_search
3.1 基本概念
search是搜索匹配,即搜索字符串中存在符合规则的子字符串。
match与search一比较便知:
cout << regex_match("123", regex("\\d")) << endl;
cout << regex_search("123", regex("\\d")) << endl;
3.2 实例
直接看例子:
string str = "Hello 2018, Bye 2017";
smatch result;
regex pattern("\\d{4}");
string::const_iterator iterStart = str.begin();
string::const_iterator iterEnd = str.end();
string temp;
while (regex_search(iterStart, iterEnd, result, pattern))
{
temp = result[0];
cout << temp << " ";
iterStart = result[0].second;
}
输出结果:2018 2017
只需要利用迭代器就可以很轻松的访问到所有匹配的结果值。
4 regex_replace
4.1 基本概念
replace是替换匹配,即可以将符合匹配规则的子字符串替换为其他字符串。
string str = "Hello_2018!";
regex pattern("Hello");
cout << regex_replace(str, pattern, "") << endl;
cout << regex_replace(str, pattern, "Hi") << endl;
4.2 扩展
除了直接替换以外,还有可以用来调整字符串内容(缩短、顺序等)。
string str = "Hello_2018!";
regex pattern2("(.{3})(.{2})_(\\d{4})");
cout << regex_replace(str, pattern2, "$1$3") << endl;
cout << regex_replace(str, pattern2, "$1$3$2") << endl;
$n用于表示第n组匹配数据(组这个概念在文章前面部分提到过),所以我们可以利用这种方式来将字符串的内容进行调整。
5 匹配忽略大小写
有时我们希望能够匹配的时候忽略大小写,这时候就要用到Regex的语法选项了。
cout << regex_match("aaaAAA", regex("a*", regex::icase)) << endl;
cout << regex_match("aaaAAA", regex("a*")) << endl;
regex::icase:匹配时忽略大小写。
6 帮助网站
附上两个写正则表达式常用到的网站
- 在线正则表达式验证
- regexper(显示正则表达式匹配结构)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)