C++ 11 新特性之正则表达式

前 8 篇在这里:

这是C++11新特性介绍的第九部分,涉及到正则表达式相关的新特性。

不想看toy code的读者可以直接拉到文章最后看这部分的总结。

题外话

对regex的完整支持,直到g++4.9才算完善。我使用的系统是Ubuntu14.04,默认g++版本号是4.8.x,所以有一些regex功能无法编译通过。可以通过以下方法安装g++4.9:

安装完成之后,需要在Makefile中强制指定所使用的g++版本。

简单用法

一切就绪,先看看如何用C++11中的regex匹配一个电子邮箱地址。

C++中的regex默认使用ECMA-262正则表达式规范,这也是众多浏览器所使用的标准。
注意到email_pattern中有好多双斜线,这是因为除了regex模块要做一次转义解析外,C++ string也会对字符串做一次转义解析。

regex选项

在构造regex对象时,可以指定多种标识已实现特定的效果。这里以使用regex::icase达到不区分大小写的匹配为例。

regex iterator

regex提供了一个迭代器,这个迭代器生成时需要一个所搜寻字符串的范围以及一个regex对象。之后,迭代器在迭代时,会遍历搜寻字符串中的所有匹配位置。

子表达式

regex也支持子表达式,和其他正则表达式一样,使用括号括起来的构成一个子表达式。在匹配结果中,序号0表示整个匹配结果,序号1表示子表达式1的匹配结果……

下面以一个座机电话号码的匹配验证为例,说明子表达式的运用:

replace

regex同样提供了替换功能。将替换功能和子表达式结合起来,可以实现字符串的格式化功能:

其中format字符串中$2和$5就分别表示第二个子表达式和第5个子表达式。

输出

整个测试程序的输出结果如下:

总结

  1. C++11种提供了regex模块,需要g++-4.9以上才能完整支持。
  2. regex默认采用ECMA-262标准,和浏览器中使用的一样。
  3. regex提供了查找、匹配、迭代器、子表达式、替换等常用用法。

完整代码详见regex.cpp

打赏支持我写出更多好文章,谢谢!

打赏作者

打赏支持我写出更多好文章,谢谢!

任选一种支付方式

1 1 收藏 评论

关于作者:usher2007

游戏开发 C/C++ Python Linux 个人主页 · 我的文章 · 9 ·    

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部