不以物喜,不以己悲

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; //第二组匹配的数据
	}

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
posted @ 2021-03-02 14:15  这种人  阅读(254)  评论(0编辑  收藏  举报