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'被解析成了正则匹配的第一个分组.