正则表达式需要头文件 #include< 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()查看一共有多少个匹配结果。
#include<iostream>
#include<stdio.h>
#include<string>
#include<cstring>
#include<vector>
#include<map>
#include<algorithm>
#include<regex>
using namespace std;
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():" << result.size() << endl;
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():" << result.size() << endl;
for (int i = 1; i < result.size(); i++)
cout << result[i] << endl;
}
else
cout << "匹配失败" << endl;
return 0;
}
//out
匹配成功:sMQ_1998
result.size():3
sMQ
1998
匹配成功:zyy_1997
result.size():3
zyy
1997
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返回的是子串后面的位置。
3、替换
string regex_replace(string s,regex p,string replace_str)
//有其他重载用法
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 << endl;
regex pattern2("([a-zA-z]{3})_(\\d{4})");
ss = regex_replace(s, pattern2, "$1"); //只要前面的字母部分
cout << ss << endl;
ss = regex_replace(s, pattern2, "$2"); //只要后面的数字部分
cout << ss << endl;
ss = regex_replace(s, pattern2, "");
cout << ss << endl;
ss = regex_replace(s, pattern2, "$3_$2"); //利用$n调整顺序
cout << ss << endl;
return 0;
}
//out
32-ops-_19988-ops-_199912
32-ops$-_19988-ops$-_199912
32-opssMQ-_19988-opsabc-_199912
32-ops32-_19988-ops_19988-_199912
32-ops_19988abc_199912-_19988-ops_199912-_199912
32sMQ8abc12
3219988199912
32812
32_19988_199912