C++ 使用 Boost 库进行正则匹配

C++ 使用 Boost 库进行正则匹配

来源: | 浏览: 11176 | 评论: 2发表时间: 2013-07-13 23:18:43

Boost C++ 函数库是一组为扩充 C++ 功能性而开发的开源程序库.为了保持代码的可重用性,Boost广泛使用模板来编写函数,但这样复杂的变量结构与函数类型也让不少初学者难以驾驭.其中的正则库被认为是C/C++所有正则库中最为强大的正则库,下面以具体现实需求为例,演示其 regex 库中的regex_match, regex_search, regex_replace等重要函数用法.



使用 Boost Regex 库

1.相关库文件的引入与编译选项

使用boost库之前,要先安装boost库,可以选择从源代码安装或者安装编译好的文件,安装十分简单,在此不再赘述.


boost库的所有头文件放在本机include文件夹下的boost文件夹下,所以在使用Boost Regex库前,先要引入相关头文件,另外,boost库的所有代码放在 boost 名字空间下,所以也要引入这个命名空间.


在编译包含了boost库的代码时,要链接相应的库文件,以下为g++编译示例代码的编译选项:


2.第一个例子,使用regex_match匹配邮箱

boost 的 regex 库中,正则表达式可以有多种写法,如果没有指定选项,默认的写法与Perl语言正则类似,不过在C++的字符串中,'\'表示转义后面的字符,'\\'才表示一个'\',而在正则中,'\'也表示转义,所以一个'正常'的正则在修改为C++正则时,所有的'\'都要加倍.邮箱检测的示例代码如下:


当regex_match只有字串和正则两个参数时,regex_match返回一个布尔值,能匹配上对应正则就返回true,否则为false


3.提取url中的域名

boost regex库也可以对捕获的内容分组记录下来,方便后面程序使用下面的示例中,括号内的内容被保存到what变量中,cmatch what是用于regex_match的结果变量,它记录了正则匹配的结果,其中what[0]保存了所匹配的整个字符串,what[1]保存了第一个分组.


4.使用反向引用匹配html标签

和Perl等语言一样,boost 的 regex 也提供了反向引用,这为匹配html标签等任务提供了很大便捷,比如要提取一个描述(title)和文字相同的a标签,可以用下面的代码:


其中的\\1表示这里应该出现第一个分组中的内容,即前面的title的属性.


5.使用regex_search搜索信息

如果只想用正则判断一个字串是否匹配固定格式,regex_match就足够了,而要在字串中搜索信息,就要用到regex_search了,下面是从一个uri字串中提取username字段的信息.


regex_search不需要原始字串,但要提供指向字串开头与结尾的迭代器.准确的说,是由这两个迭代器决定了regex_search的搜索范围. match_default 是匹配模式信息,就像Perl语言中的 i/m/u/g 一样,改变它就能提供如不区分大小写,点号增强等功能.


6.使用regex_search提取所有匹配

其实对于上个例子,我们只要改改正则,用regex_match也能达到目的,而提取所有匹配,就只能用regex_search了.因为前面的函数,最多也只返回了一个结果,下面的代码提取了uri中所有字段的信息.


提取所有信息,就是在字串中反复的搜索,由start提供了搜索的开始位置,在匹配到数据之后.匹配结果集what中what[0].second保存了这次匹配的最后一个位置,所以把它赋值给start,就能从这里进行下一轮搜索.如果找不到匹配.regex_search返回false,while循环结束.


7.正则替换

正则表达式的第三个常用功能就是正则替换了.boost的regex库中regex_replace函数提供了正则替换的相关功能.例如我们要把所有的单词'hello'替换为'olleh',可以用下面的代码:


为了确定单词边界,在匹配中我用到了'环视'的功能.许多如php等语言都没有提供完整的正则环视.而boost的regex库确可以使用.否定逆序环视(?<!)表示要在左边不匹配一个位置,否定顺序环视(?!)表示要在右边不匹配一个位置,左右都不是字母,就可以完美确定一个单词的边界了.


7.正则替换中的反向引用

和regex_match中的例子一样,在regex_replace中也可以使用反向引用,只不过反向引用的符号'\\1'是写在将被替换的字串中的.下面的代码把所有xx2这样的变量名替换为xx3:


目标字串中的'\\1'被解析成了正则匹配的第一个分组.


附录:完整的示例代码



相关文章
  • 声明: 评论属于其发表者所有,不代表本站的观点和立场.
  • 西安商家回复该留言时间: 2013-07-16 03:12:29

    正则替换中的反向引用[b][/b]

  • 麒博客影评回复该留言时间: 2013-07-17 06:31:17

    完全不懂代码,友情支持!

已有 2 位网友发表了一针见血的评论,你还等什么?
  • 昵称: *
  • 邮箱:
  • 网址:
  • 记住我的信息
  • Color
  • Red
  • Blue
  • Code
  • bash
  • cpp
  • css
  • java
  • js
  • perl
  • php
  • python
  • ruby
  • sql
  • xml