C++正则表达式处理Boost库使用

来源:互联网 发布:矩阵分析视频百度网盘 编辑:程序博客网 时间:2024/06/05 03:10

http://www.wuzesheng.com/?p=965

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

1. 什么是Boost.Regex? 

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

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

2. Boost.Regex的编译

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

(1)Http下载,下载地址是http://sourceforge.net/projects/boost/files/boost/1.42.0/

(2)用svn客户端来下载,地址是:http://svn.boost.org/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所提供的十分类似,具体可以参考:

http://www.boost.org/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所提供的接口参见:

http://www.boost.org/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所提供的接口请参考:

http://www.boost.org/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用来判定整个字符串是否匹配指定的的正则表达式, 具体定义参见:

http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/ref/regex_match.html

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

http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/ref/regex_search.html

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

http://www.boost.org/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"       int main(int argc, char ** argv)   {       if (argc != 4)       {              std::cerr < < "Usage: " << argv[0] << " option regex text\n"               << "option: 0 --whole match\n"               << "        1 --sub match\n"               << "        2 --replace match\n";           return 1;       }              boost::regex oRegex(argv[2]);       boost::smatch oResults;       std::string strStr(argv[3]);       std::string strRes;           switch (atoi(argv[1]))       {              case 0:               if(boost::regex_match(strStr, oResults, oRegex))               {                      std::cout << strStr << " matches " << oRegex << "\n";               }                  else               {                      std::cout << strStr << " doesn't match " << oRegex << "\n";               }                  break;           case 1:               if(boost::regex_search(strStr, oResults, oRegex))               {                   std::cout << strStr << " matches " << oRegex << "\n";               }               else               {                   std::cout << strStr << " doesn't match " << oRegex << "\n";               }               break;           case 2:               strRes = boost::regex_replace(strStr, oRegex, "");               std::cout << "strRes=" << strRes << "\n";               break;           default:               std::cerr << "Invalid option: " << argv[1] << "\n";               break;       }   }   

下面是程序运行的结果:

1

2

3

4

5

6

7

8

wuzesheng@wuzesheng-ubuntu:~/Program$ !g++

g++ -I./boost_1_42_0 BoostRegex.cpp -L ./boost_1_42_0/libs/regex/build/gcc/ -lboost_regex-gcc-1_42 -o BoostRegex

wuzesheng@wuzesheng-ubuntu:~/Program$ ./BoostRegex 0 "http:\/\/www\..*\.com" "http://www.soso.comjfj"

http://www.soso.comjfj doesn't match http:\/\/www\..*\.com

wuzesheng@wuzesheng-ubuntu:~/Program$ ./BoostRegex 1 "http:\/\/www\..*\.com" "http://www.soso.comjfj"

http://www.soso.comjfj matches http:\/\/www\..*\.com

wuzesheng@wuzesheng-ubuntu:~/Program$ ./BoostRegex 2 "http:\/\/www\..*\.com" "http://www.soso.comjfj"

strRes=$$jfj

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


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微信钱包里的零钱不见了怎么办 买家说支付宝没钱要微信付钱怎么办 微信红包没绑卡密码忘了怎么办 手机微信红包密码忘了怎么办 qq账号忘了怎么办什么也没绑定 手机银行转账名字对卡号错了怎么办 手机夸行转账卡号输入错了怎么办 移动开通了20元流量卡怎么办? 联通手机充值卡网上充值话费怎么办 提现金额和实际到账不一样怎么办 二冲踏板冷车加油熄火怎么办? qq被盗绑定了别人的银行卡怎么办 如何更改微信支付密码忘记了怎么办 微信钱包没绑银行卡忘记密码怎么办 微信密码忘记了也没绑银行卡怎么办 微信支付密码忘记了没银行卡怎么办 想找回原来的k歌忘了密码怎么办 手机微信钱包支付密码忘了怎么办 微信支付账户被注销了怎么办 微信钱包密码忘了怎么办没绑银行卡 微信钱包密码忘了怎么办不用银行卡 企业网银密码输入三次错误怎么办 微信密码不知道手机也停用了怎么办 手机停用微信密码不记得了怎么办 农商银行登入密码忘记了怎么办 苹果手机忘记四位数解锁密码怎么办 银行卡用支付宝支付限额了怎么办 用银行卡号找回微信被盗密码怎么办 微信钱包密码错误被锁定怎么办 本人没玩财付通结果被扣了钱怎么办 我的银行卡给支付宝充不了钱怎么办 支付宝话费充错了怎么办啊 已充值成功送朋友话费不能送怎么办 微信绑定银行卡被盗刷q币怎么办 微信红包过了24小时没退回怎么办 微信6.67版本红包发错了怎么办 苹果6s还原后激活出错怎么办 q币充给了不存在的账号怎么办 怎么办微信的钱换成淘宝币 学信网密码密保手机号都忘了怎么办 第五人格玩游戏时总是闪退怎么办