又好久没写文章了,最近攒了几个话题,还没来得及写,在年末的最后一天,还是要写一篇,跨年啦~一篇文章写到2020年。不抛弃不放弃,过几年再看看现在写的,就如同我现在看之前写的。还有就是刚刚研究了一下如何做个标题党,来了一个(哈哈)。废话不多说,开始正题。
我们都会或多或是的用到过正则匹配,大家真的清楚用的是哪种正则吗?各种语言的正则又有哪些异同呢?
目录
2.1.3 [阻止回溯匹配(Possessive repeats)]
2.1.4 [反向引用(回引 back references)]
4 boost::regex 和 std::regex 的性能对比
1 各种各样的正则表达式
翻看boost, cplusplus的官方文档可以看出来,主要有三种正则表达式:基本的正则表达式(Basic RegEx),扩展的正则表达式(Extended RegEx),Perl正则表达式(Perl RegEx).
图 1 boost 库中主要支持的三种正则表达式。boost::regex 默认使用的是 Perl 正则表达式。
图2 c++标准库中主要支持的正则表达式。std::regex 默认使用使用的是 ECMAScript 正则表达式(后面再来讲讲ECMAScript是什么)。
2 boost::regex 的简单介绍
boost::regex e1(my_expression); 默认设置的式boost::regex::perl,perl 和其他正则类型比较起来支持的内容更多,兼容性也就更好。
2.1 Perl 正则表达式
2.1.1 基本字符含义
除了下面的字符以外,其他字符都和自己匹配,
. [ { } ( ) \ * + ? | ^ $
. 表示任意一个字符
^ 匹配开头字符
$ 匹配结尾字符
() 子表达式,可以把子表达式作为一个单元进行正则处理。
这里有个副作用,在结果中会有匹配子串的字段,小括号里面用 ?: 可以屏蔽捕获。例如(?:ab)+
*匹配前面的原子(preceding atom)0次或多次
+匹配前面的原子(preceding atom)1次或多次
?匹配前面的原子(preceding atom)0次或1次
a{n} 匹配a字符n次
a{n,} 匹配a字符n次或更多次
a{n, m} 匹配a字符n到m次
2.1.2 [贪婪模式] 和 [非贪婪模式]
贪婪模式会尽可能多的匹配,如 字符串abcdc, 正则a*c,会匹配到abcdc,而非贪婪匹配结果为abc,匹配到结果就好,不需要匹配的那么多。非贪婪模式需要添加 ?表示,如a*?c.
*?表示匹配前面的原子0次或多次,最短匹配
+?表示匹配前面的原子1次或多次,最短匹配
??表示匹配前面的原子0次或1次,最短匹配
{n,}? 匹配前面的原子n次或多次,最短匹配
{n, m}? 匹配n到m次,最短匹配
2.1.3 [阻止回溯匹配(Possessive repeats)]
默认