1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 深入浅出C/C++中的正则表达式库(二)——Boost.Regex

深入浅出C/C++中的正则表达式库(二)——Boost.Regex

时间:2021-07-17 14:21:31

相关推荐

深入浅出C/C++中的正则表达式库(二)——Boost.Regex

写在前面:本文是《深入浅出C/C++中的正则表达式库》系列的第二篇,如果对本文感兴趣,相信你也会对《深入浅出C/C++中的正则表达式库——GNU Regex Library》感兴趣。本文主要介绍Boost中的正则表达式库,通过介绍其基本内容与相关接口,希望能够教读者朋友学会如何使用该库。

1. 什么是Boost.Regex?

Boost是C++中仅次于STL的一套库,它的功能比STL更加全面。这里是Boost的主页,想了解Boost的朋友可以看一下:/doc/libs/1_37_0/libs/regex/doc/html/index.html。需要说明的一点是,Boost目前还不是C++标准库的一部分,因此如果要使用Boost中的库,需要自己安装一下。

Boost.Regex是Boost中的正则表达式库,它是由John Maddock提供的,它的全部文档在这里:/doc/libs/1_37_0/libs/regex/doc/html/index.html

2. Boost.Regex的编译

最新的Boost库是1.42.0,在使用Boost.Regex之前,需要先下载Boost库,可以通过下面两种方式下载:

(1)Http下载,下载地址是/projects/boost/files/boost/1.42.0/

(2)用svn客户端来下载,地址是:/svn/boost/trunk/

我个人比较推荐使用svn客户端来下载,这样的话,如果要更新直接svn update一下,就不用再去重新下载了。

下载好了Boost库,下面开始编译, 本文中我以Linux平台为例进行说明,其它平台的编译方法参见上面提到的文档。下面是具体的步骤:(假设下载完后的,代码解压在了BOOST_ROOT目录)

(1)进入到BOOST_ROOT/libs/regex/build目录

(2)如果要使用静态库,请执行make -fgcc.mak

(3)如果要使用静态库,请执行make -fgcc-shared.mak

执行完上面三步后的,在BOOST_ROOT/libs/regex/build/下会生成一个gcc目录 ,进入该目录 ,可以看到生成了下面四个文件:

(1)libboost_regex-gcc-1_42.a , 这是release版的静态库

(2)libboost_regex-gcc-1_42.so, 这是release版的动态库(共享库)

(3)libboost_regex-gcc-d-1_42.a, 这是debug版的静态库

(4)libboost_regex-gcc-d-1_42.so, 这里debug版的动态库(共享库)

编译好之后的,就可以开始使用了。这里提供一个我编译好的版本,如果读者朋友不想自己编译,可以直接从我这里下载使用,下载完记得校验一下MD5: b6e0d805ea22ba08cb230ca98a517953。

点此下载:libboost_regex.tar.gz。

3. Boost Regex Libray类和接口介绍

(1)basic_regex

basic_regex是一个模板类,它封装了正则表达式的解析和编译,它是Boost.Regex中用来表示正则表达式的对象类型。Boost.Regex定义了两种标准类型,一种是基于单字节字符的regex,另一种是基于宽字符的wregex

关于basic_regex提供的接口,和STL中basic_string所提供的十分类似,具体可以参考:

/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/ref/basic_regex.html

(2)match_results

match_results是用来表示所有匹配指定正则表达式的字符串的集合的对象类型。Boost.Regex提供了四种标准类型的定义:C单字节字符 类型的cmatch, C宽字符类型的wcmatch, C++单字节字符类型smatch, C++宽字符类型wsmatch。match_results所提供的接口参见:

/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/ref/match_results.html

(3)sub_match

sub_match是用来表示匹配指定正则表达式的字符串的对象类型。match_results就是由sub_match组成的集合类型。

关于sub_match类型,有下面三点需要注意的:

a. sub_match类型的对象只能通过对match_results类型的对象取下标获取

b. sub_match类型的对象可以和std:basic_string或const char*的字符串进行比较

c. sub_match类型的对象可以和std::basic_string或const char*的字符串相加,生成新的std::basic_string类型的字符串

sub_match所提供的接口请参考:

/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/ref/sub_match.html

(4)reg_match, reg_search和reg_replace

reg_match, reg_search和reg_replace都是Boost.Regex所提供的具体进行正则匹配的算法接口。

reg_match用来判定整个字符串是否匹配指定的的正则表达式, 具体定义参见:

/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/ref/regex_match.html

reg_search用来判定字符串的某一部分是否匹配指定的正则表达式, 具体定义参见:

/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/ref/regex_search.html

reg_replace用来把字符串中匹配指定正则表达式的部分替换为指定内容输出,对于不匹配的部分原样输出, 具体定义参见:

/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/ref/regex_replace.html

4. Boost Regex Libray使用注意事项

(1)在使用之前你需要把Boost的安装目录加入到系统的Path中(当然也可以在编译时直接指定)

(2)需要包含的头文件 boost/regex.hpp

(3)需要依赖的库:下载2中编译好的libboost.tar.gz,取其中任意一个即可,具体如何使用动态/静态库,请自己查阅相关资料

(4)Boost.Regex还提供对Unicode类型的支持,具体细节参加上面提到的文档,我这里不做介绍

5. Boost.Regex使用举例

下面是Boost.Regex使用的一个简单的例子:

#include<string>#include<iostream>#include"boost/regex.hpp"intmain(intargc,char**argv){if(argc!=4){std::cerr<<"Usage:"<<argv[0]<<"optionregextext\n"<<"option:0--wholematch\n"<<"1--submatch\n"<<"2--replacematch\n";return1;}boost::regexoRegex(argv[2]);boost::smatchoResults;std::stringstrStr(argv[3]);std::stringstrRes;switch(atoi(argv[1])){case0:if(boost::regex_match(strStr,oResults,oRegex)){std::cout<<strStr<<"matches"<<oRegex<<"\n";}else{std::cout<<strStr<<"doesn'tmatch"<<oRegex<<"\n";}break;case1:if(boost::regex_search(strStr,oResults,oRegex)){std::cout<<strStr<<"matches"<<oRegex<<"\n";}else{std::cout<<strStr<<"doesn'tmatch"<<oRegex<<"\n";}break;case2:strRes=boost::regex_replace(strStr,oRegex,"$$$$");std::cout<<"strRes="<<strRes<<"\n";break;default:std::cerr<<"Invalidoption:"<<argv[1]<<"\n";break;}}

运行结果:

wuzesheng@wuzesheng-ubuntu:~/Program$!g++g++-I./boost_1_42_0BoostRegex.cpp-L./boost_1_42_0/libs/regex/build/gcc/-lboost_regex-gcc-1_42-oBoostRegexwuzesheng@wuzesheng-ubuntu:~/Program$./BoostRegex0"http:\/\/www\..*\.com""jfj"jfjdoesn'tmatchhttp:\/\/www\..*\.comwuzesheng@wuzesheng-ubuntu:~/Program$./BoostRegex1"http:\/\/www\..*\.com""jfj"jfjmatcheshttp:\/\/www\..*\.comwuzesheng@wuzesheng-ubuntu:~/Program$./BoostRegex2"http:\/\/www\..*\.com""jfj"strRes=$$jfj

以上即是Boost.Regex的主要的内容以及具体使用的一些情况。这里我需要说明一下,由于Boost.Regex所提供的像 basic_regex, match_results, sub_match这些类型,它们的封装与C++中string等其它stl容器的封装很相似,因此使用过程中可以做联想类比,以加深理解。另外,像 regex_match, regex_search, regex_replace这些算法都是模板函数,而且都有多个重载版本,在使用的时候,注意选择适合自己的应用场景的版本。

本文转自nxlhero 51CTO博客,原文链接:/nxlhero/887155,如需转载请自行联系原作者

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。