写在前面:本文是《深入浅出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使用的一个简单的例子:

  1. #include <string>
  2. #include <iostream>
  3. #include "boost/regex.hpp"
  4. int main(int argc, char ** argv)
  5. {
  6. if (argc != 4)
  7. {
  8. std::cerr < < "Usage: " << argv[0] << " option regex text\n"
  9. << "option: 0 --whole match\n"
  10. << "        1 --sub match\n"
  11. << "        2 --replace match\n";
  12. return 1;
  13. }
  14. boost::regex oRegex(argv[2]);
  15. boost::smatch oResults;
  16. std::string strStr(argv[3]);
  17. std::string strRes;
  18. switch (atoi(argv[1]))
  19. {
  20. case 0:
  21. if(boost::regex_match(strStr, oResults, oRegex))
  22. {
  23. std::cout << strStr << " matches " << oRegex << "\n";
  24. }
  25. else
  26. {
  27. std::cout << strStr << " doesn't match " << oRegex << "\n";
  28. }
  29. break;
  30. case 1:
  31. if(boost::regex_search(strStr, oResults, oRegex))
  32. {
  33. std::cout << strStr << " matches " << oRegex << "\n";
  34. }
  35. else
  36. {
  37. std::cout << strStr << " doesn't match " << oRegex << "\n";
  38. }
  39. break;
  40. case 2:
  41. strRes = boost::regex_replace(strStr, oRegex, "$$$$");
  42. std::cout << "strRes=" << strRes << "\n";
  43. break;
  44. default:
  45. std::cerr << "Invalid option: " << argv[1] << "\n";
  46. break;
  47. }
  48. }

运行结果:

  1. wuzesheng@wuzesheng-ubuntu:~/Program$ !g++
  2. g++ -I./boost_1_42_0 BoostRegex.cpp -L ./boost_1_42_0/libs/regex/build/gcc/ -lboost_regex-gcc-1_42 -o BoostRegex
  3. wuzesheng@wuzesheng-ubuntu:~/Program$ ./BoostRegex 0 "http:\/\/www\..*\.com" "http://www.soso.comjfj"
  4. http://www.soso.comjfj doesn't match http:\/\/www\..*\.com
  5. wuzesheng@wuzesheng-ubuntu:~/Program$ ./BoostRegex 1 "http:\/\/www\..*\.com" "http://www.soso.comjfj"
  6. http://www.soso.comjfj matches http:\/\/www\..*\.com
  7. wuzesheng@wuzesheng-ubuntu:~/Program$ ./BoostRegex 2 "http:\/\/www\..*\.com" "http://www.soso.comjfj"
  8. strRes=$$jfj

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

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

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

  1. 深入浅出C/C++中的正则表达式库(一)--GNU Regex Library

    正则表达式(Regular Expressions),又被称为regex或regexp,是一种十分简便.灵活的文本处理工具.它可以用来精确地找出某文本中匹配某种指定规则的内 容.在linux下,gre ...

  2. VBA中的正则表达式(二)

    VBA中的正则表达式(二) --IgnoreCase属性 1. IgnoreCase属性 IgnoreCase属性有两个可选值,True或False. 2. IgnoreCase属性案例 Sub re ...

  3. pcre c语言,C/C++中的正则表达式库 - PCRE,PCRE++

    最近使用boost::regex正则,遇到了延时问题,更换为pcre,延时问题得到解决.这里记录一下pcre的内容. PCRE,PCRE++介绍 PCRE :(Perl Compatible Regu ...

  4. c语言是正则表达式使输入为正整数,C语言中的正则表达式

    正则表达式(Regular Expressions),又被称为regex或regexp,是一种十分简便.灵活的文本处理工具.它可以用来精确地找出某文本中匹配某种指定规则的内容. 关于正则表达式的教程, ...

  5. python网络爬虫方向的第三方库_Python网络爬虫中常用第三方库总结

    python对于爬虫的编写已经是相当的友好了,不过除了利用requests库或者scrapy框架之外,有一些库还需要我们知道,以便于我们更熟练.便捷的完成目标数据的爬取,接下来我就总结一下我认为在爬虫 ...

  6. vc 可用的正则表达式库

    vc 可用的正则表达式库 gnuregex,PCRE,greta,boost,CAtlReg 其中 CAtlReg 和greta 是微软的,不过 greta 据说已经多年不维护,不能在最新的编译器中编 ...

  7. 【JavaSE】java中的正则表达式(从0到1学会正则表达式)

    文章目录 前言 一.正则表达式的三个常用类 1.Pattern类 2.Matcher类 3.PatternSyntaxException类 二.正则表达式的底层实现 1.Matcher.find()和 ...

  8. 深入浅出之正则表达式(二)

    深入浅出之正则表达式(二) http://dragon.cnblogs.com/archive/2006/05/09/394923.html 前言:        本文是前一片文章<深入浅出之正 ...

  9. 高翔博士SLAMBOO2十二讲代码库中的三方库没有下载下来 ,需要手动对三方库单独下载的git的命令如下

    高翔博士SLAMBOO2十二讲代码库中的三方库没有下载下来 git clone --recursive https://github.com/gaoxiang12/slambook2.git 需要手动 ...

最新文章

  1. Ryzen 4000 Vermeer CPU和Radeon RX Big Navi 图形卡
  2. java c 效率_吐槽一下java的效率。。。比起C差的真的好远。。。
  3. 2022.3.14矮牵牛
  4. 华为交换机的配置及:access、trunk、hybird端口详解
  5. SAP Spartacus的用户登录页面设计
  6. Laravel 将数据表中的数据导出,并生成seed文件
  7. python读取图像数据流_浅谈TensorFlow中读取图像数据的三种方式
  8. UML应用:业务内涵的分析抽象amp;表达
  9. 应届生找工作是首先选择一个公司,还是选择一个行业?
  10. Asp.net发布网站
  11. 温一壶月光下的酒——林清玄
  12. 10G 82599EB 网卡测试优化 ethtool
  13. 2022最新影视小程序源码+支持JSON/卡密系统
  14. java虚拟机、垃圾回收、多线程
  15. 未激活的Windows11的壁纸更改方法(亲测有用)
  16. Spring+Hibernate 复杂查询分页
  17. 功率最好的数据恢复软件FinalRecovery绿色D版
  18. android动画!程序员工作2年月薪12K,算法太TM重要了
  19. Ubuntu18.04 安装glibc2.29
  20. 请使用java编写自定义麻将游戏

热门文章

  1. golang Println、Printf、Sprintf的区别
  2. Centos7 ubuntu 安装Telnet服务
  3. linux 可执行文件去除绝对路径
  4. Linux系统编程:循环创建N个子线程并顺序输出
  5. 队列的链式存储结构及实现
  6. 【glibc源码分析】--strcpy.c 字符串复制
  7. QTP 无法识别web 大全
  8. zoj 1789 The Suspects
  9. 实现库函数strlen和strcpy
  10. Android save pictrue by SQLiteOpenHelper