C++ 正则表达式
C++ 正则表达式
正则表达式处理的是文本。这可能是一个字符串对象,也可能是一个文本文件,或者是一堆日志。
匹配:regex_match()
匹配是判断给定的字符串是否符合某个正则表达式,所以匹配的特性是完全匹配。例如:判断文本是否全部由数字构成:
regex ex("\\d+"); //表达式需先使用 '\'转义,否则 ’\d’会被视为字面量
string s1 = “dadw12411”;
cout<< regex_match(s1,ex); // 结果返回1
另一种版本,使用 smatch 或 cmatch (类似于string 和 **const char ***)
regex ex("\\d+");
string s1 = "dadw12411";
string s2 = "3124511";
smatch m1,m2; //m1,m2用于保存匹配的结果
regex_match(s1,m1,ex); //使用提供的模板函数
regex_match(s2,m2,ex);
//可以使用内部封装好的迭代器 或者 使用下标遍历的方式遍历
for(auto it = m1.begin();it != m1.end();++it){
cout<< *it <<" "; //多次空打印,既无结果
}
for(auto it = m2.begin();it != m2.end();++it){
cout<< *it <<" "; //打印出3124511,只打印一次,结果存放在m[0]处
}
搜索:regex_search()
类似于匹配,但是非完全匹配,只要目标字符出现,既会返回。
regex ex("\\d+");
string s2 = "dwaf123gad521";
smatch match;
regex_search(s2,match,ex);
cout<<match[0] //结果保存至match中
替换:regex_replace()
替换完全匹配表达式的部分,不会改变原字符串,函数返回一个新字符串。
regex ex("\\d+");
string s1 = "ad142451ge123";
string s2 = regex_replace(s1,ex,"what is this");
cout<<s2<<" "; //输出:adwhat is this gewhat is this
此外,类似于 \\d+ 这样的表达式,我们可以看作成一个变量,符号为$n (n可以看出出现的位置,位置从1开始算起)
所以文本就可以被变量分割:
regex ex("(\\d+)-(\\w+)"); // “数字-字符"的文本格式
string s = “0001-Neo,0002-lucia”;
cout<< regex_replace(s,ex,"$1 name= $2"); //输出:0001 name= Neo,0002 name= lucia
分词:sregex_token_iterator()
将遇到的表达式作为分割标示符,遇见一个,分割一次。
std::string mail("123@qq.vip.com,456@gmail.com,789@163.com,abcd@my.com");
std::regex reg(",");
std::sregex_token_iterator pos(mail.begin(), mail.end(), reg, -1); //迭代器做参数
decltype(pos) end; //返回也是迭代器
for (; pos != end; ++pos)
{
std::cout << pos->str() << std::endl;
}
//输出: 123@qq.vip.com
// 456@gmail.com
// 789@163.com
// abcd@my.com
补充:
当我们需要一个类似于"\w\w\w\\w\\w\w\w\w\\\w\w\w\w\\\w",有很多反斜杠的字符串,并且不需要转义时,我们应该采用**Raw string literal **来表示,将内部的内容视为纯字符。如:
//格式为: R"(content)",content即使需要的字符串本身
string s = R"(\\w\w\\w\\\w\\\w\w\w\w\\\\\w\\w\w\w\\\\\w)";
cout<<s; //输出:\\w\w\\w\\\w\\\w\w\w\w\\\\\w\\w\w\w\\\\\w
符号介绍:
参考文献:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)