C++ 正则使用
C++ 正则使用
C++的正则支持是在C++11中才支持的,需要引用头文件
#include<regex>
正则表达式声明
regex pattern("\\d{3}");
regex pattern2("\\d{3}", regex::icase); //忽略大小写
regex_match
match是全文匹配,要求整个字符串符合匹配规则。
cout << regex_match("123", regex("\\d")) << endl; //结果为0
cout << regex_match("123", regex("\\d+")) << endl; //结果为1
更多时候,我们是希望得到匹配的结果。
string str = "hello_2021";
::smatch result;
::regex pattern("([a-z]{5})_(\\d{4})");
if (::regex_match(str, result, pattern))
{
cout << result.size() << endl;//匹配到的组数量
cout << result[0] << endl; //完整匹配结果
cout << result[1] << endl; //第一组匹配的数据
cout << result[2] << endl; //第二组匹配的数据
//第二种显示形式
cout << result.str() << endl; //完整结果
cout << result.str(1) << endl; //第一组匹配的数据
cout << result.str(2) << endl; //第二组匹配的数据
}
regex_search
search是搜索匹配,搜索字符串中存在符合规则的子字符串。
cout << ::regex_match("123", ::regex("\\d")) << endl; //返回0
cout << ::regex_search("123", ::regex("\\d")) << endl; //返回1
输出匹配到的字符
string str = "hello 2019, ni hao 2020, tai hao 2021";
::smatch result;
regex pattern("\\d{4}");
string::const_iterator iterStart = str.begin();
string::const_iterator iterEnd = str.end();
while (regex_search(iterStart, iterEnd, result, pattern))
{
string temp = result[0];
cout << temp << endl;
iterStart = result[0].second;
}
举个实际的例子:
string input = "rtsp://10.117.12.2:9554/app/stream";
::regex pattern("([0-9.]+){4}");//匹配input中的IP地址提取
::smatch result;
if (regex_search(input, result, pattern))
{
cout << result.str() << endl; //输出10.117.12.2
}
regex_replace
replace是替换匹配,可以将符合匹配规则的子字符串替换为其它字符串。
string str = "hello_2021";
::regex pattern("hello");
cout << regex_replace(str, pattern, "") << endl; //输出为_2021,将hello替换为""
cout << regex_replace(str, pattern, "world") << endl; //输出为world_2021