《C++标准库第2版》正则表达式学习笔记

测试环境: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那样指明八进制转义序列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值