测试环境:Windows+VC2022
总结:
只需掌握3个命令就足以使用绝大部分正则表达式的功能了,分别是:
regex //正则表达式的模式语法
regex_search //匹配搜索函数
match //结果存储对象
如果要使用替换功能则还有
regex_replace //替换函数
一.字符串
除了使用传统的双引号界定的字符串,C++11引入了新的文本写法(Raw String):
R"(字符串,字符串,字符串)"
完整语法如下:
R"delim(.....)delim"
这里的delim最多可以16个字符,基本符合c++的变量名规则。
示列:
R"abc(c:\windows\system32)abc"
R"_abc(c:\windows\syst)em32)_abc"
R"_(c:\windows\)_"
使用长定界符的好处是可以让字符串里可以包含 )" ,如下:
s = R"_x(C:\Program Files (x86)\Microsoft V R"_x(isu)_y"al Studio 14.0\)"ht\v3.0)_x";
如果此时的字符串中需要包含)_x"怎么办?那就换一个定界符,如:R"_z(...)_z"。因为这里本就是码农人工输入而不是运行时生成,所以足以应对各种情况。
严格来说这不属于正则表达式的内容,但它在正则表达式中应该是比较实用的,否则双层转义能把人搞晕。
二.regex
1.regex用于定义正则表达式的模式(Pattern)
2.std::regex是模板类class std::basic_regex<>的特化,char对应regex,wchar_t对应wregex
using regex = basic_regex<char>;
using wregex = basic_regex<wchar_t>;
3.示例:
a) regex reg1("<.*>.*</.*>");
b) regex reg2("<(.*)>.*</\\1>"); //使用子匹配,由圆括号界定。
\1表示要求匹配与1号子匹配一样的字符串,如果指定一个表达式中不存在的子匹配如\2则在构造regex时(而不是regex_match()时)会抛出一个错误regex_error,需要使用try...catch捕捉异常,如下:
try
{
bool found = regex_match("<tag>value</tag>", regex("<(.*)>.*</\\2>"));
}
catch (regex_error& re)
{
int e = re.code();
const char* info = re.what();
}
c) regex reg3("<\\(.*\\)>.*</\\1>", regex_constants::grep); //指定模式的文法。
默认文法是ECMAScript(欧洲计算机制造商协会,ECMA- 262脚本语言的规范:规范化脚本语言,叫ECMAScript),另外还有:basic、extended、awk、grep、egrep
ECMAScript是目前威力最强大的文法。它少有不支持的性质是,像grep和egrep那样使用newline字符搭配"or"分隔多个pattern,以及像awk那样指明八进制转义序列

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



