在C++ Builder6上使用Boost正则表达式库

原创 2003年06月27日 14:17:00

C++ Builder6上使用Boost正则表达式库<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

撰文:Aweay

正则表达式是一种模式匹配形式,它通常用在处理的文本程序中。比如我们经常使用的grep工具,还是perl语言都使用了正则表达式。传统的C++处理正则表达式是非常麻烦的,这也成为很多其他语言爱好者的笑柄,现在情况不一样了,因为有了boost

Boost是一个基于Template的开发源代码库,在这个库中有很多子库用来高效处理各方面的问题,比如字符串拆分,格式化,线程等等,Boost对于每一个C++爱好者都是应该了解的,对于C++ Builder用户如果能在熟练使用VCL的情况下再熟练使用Boost,我想一定如虎添翼。

一般来说,使用Boost是非常简单,和使用其他STL库没有太大区别,但使用Boost的正则表达式库则不那么容易,因为这个库还需要我们单独编译,下面我将详细介绍如何使用。

如果你还不知道或者还没有Boost的话,你可以去www.boost.org下载最新版本,作者使用的是1.30版本。将下载下来的zip[1]解压到任何你喜欢的目录,比如D:/boost

编译正则表达式库

前面已经提到,这个库需要我们单独编译才能使用,为什么不编译好一起发布呢?主要是考虑到不同的编译器需要不同的链接库文件和链接库太大了。在命令行下,进入[%Boost]/Libs/RegEx/Build目录,直接敲入make –fbcb6.mak命令开始编译,这里请大家注意了,如果你的计算机上同时安装了BCB5,请一定要把path设置成为BCB6bcc32.exe程序所在的目录,否则可能使用BCB5make程序,这样虽然能编译但最后不能使用。

编译过程相当耗时,你需要耐心等待,最终编译完成,会在[%Boost]/Libs/RegEx/Build目录生成一个BCB6目录,在这个目录生成了很多lib文件和dll文件,把所有dll文件复制到windows系统目录,所以lib文件复制到bcb6/lib目录。如果你不想这么麻烦的复制文件,可以在编译时加入install参数,就像这样make –fBcb6.mak install,不过作者还是比较喜欢前一种方式,这样我可以知道到底生成了什么文件。现在编译已经完成了,你可以体现boost的神奇魅力了。

一个测试程序

BCB6中创建console程序,编写下列代码:

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

#include<deque>

#include<iostream>

#include<algorithm>

#include<boost/regex.hpp>

 

int main()

{

  using namespace boost;

  using namespace std;

  regex expression("//s+href//s*=//s*/"([^/"]*)/"",regbase::normal|regbase::icase);

  string s="<a href=/"index.html/"><img src=/"logo.gif/"></a>";

  deque<string> result;

  regex_split(std::back_inserter(result),s,expression);

  copy(result.begin(),result.end(),ostream_iterator<string>(cout,"/n"));

  int c;

  cin>>c;

  return 0;

}

<?xml:namespace prefix = w ns = "urn:schemas-microsoft-com:office:word" />

设置BCB6 Project属性的Lib PathInclude Path为你安装boost的目录,运行你会看到结果:

<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />index.html

可以看到index.html已经从字符串中提出出来了,那么为什么会是这样呢?

代码的核心部分是:

regex expression("//s+href//s*=//s*/"([^/"]*)/"",regbase::normal|regbase::icase);

它用来设置如何匹配字符串,上面乱七八糟的字符串很难看懂,如果不了解正则表达式的书写规则,上面代码可以和天书媲美。

regbase::normal|regbase::icase 是解析参数设置,具体可以参考boost帮助文档。

正则表达式的书写规则

具体的书写规则,大家可以参看boost的文档,我这里做一下简要说明:

. (dot)

用来匹配任何一个字符,但不包括新行上的字符

*

闭包,任意有限次的自重复连接

+

有限次自重复连接,但至少出现一次

{}

指定可能的重复次数

例如:

ba* 匹配 b ba baa baaa

ba+ 匹配 ba baa baaaaaaaaa

ba{1,5} 匹配 ba baa baaa baaaa baaaaa

/

转义字符,有很多用途,根据参数设置而变化,最常见的就是类似于c语言/的用法

/s

匹配空格

/w

匹配一个单词

/d

匹配数字

()

有两种用法:

1是合并的作用,例如(ab)*匹配ab abab ababab

2是确定匹配,也就是说在()中的字符将被最终拆解出来

根据上面这张表,我们可以很容易知道前面的那段天书如何解释。

一个实际的例子

前一段时间在CSDN上有一篇帖子,问题是有一种文件结构如(类似):

@People{

Age=19

Speek=”Hay,{name},how are you”

}

问如何拆分字符串得到@后面的名字,=两边的属性名和属性值,引号里{}种的名字。

解决这个问题用正则表达式再合适不过了。

根据分析,我们可以这样构造匹配规则:

"@(.*?)/s*//{" 匹配@开始的字符创,后面两种类型如何构造匹配规则留给大家思考吧。

这样我们可以轻易拆解这个例子。

性能分析

通过上面的讨论,大家已经了解到boost的强大威力,那个性能又如何呢?为此我们再实际来拆分一个复杂的html代码,看看到底需要花费多少时间。

为了节省篇幅,这里就不列出html代码了,不过可以告诉大家,这是一个又Word生成的大小为186Khtml文件,这个文件中用到了很多<table>标签,所以我这里测试就来拆分所有<table>标签的width属性。测试代码如下:

#include<deque>

#include<iostream>

#include<algorithm>

#include<boost/regex.hpp>

#include<vcl.h>

 

int main()

{

  using namespace boost;

  using namespace std;

  TStringList* html=new TStringList();

  html->LoadFromFile("D://1.htm");

  regex expression("//s+width=([^/"]*)/s+",regbase::normal|regbase::icase);

  DWORD start=GetTickCount();

  for(int n=0;n<html->Count;n++)

  {

    string s=html->Strings[n].c_str();

    deque<string> result;

    regex_split(std::back_inserter(result),s,expression);

copy(result.begin(),result.end(),ostream_iterator<string>(cout,"/n"));

result.clear();

  }

  start=GetTickCount()-start;

  delete html;

  cout<<start;

  int c;

  cin>>c;

  return 0;

}

输出结果为671毫秒,拆分得到1072width属性值,我们可以看到boost的效率是非常高的,虽然与一些角本语言比起来解析速度还是慢,但已经可以满足大多数编程要求了。另外作者的计算机配置并不是非常高,相信拿到现在任何一台主流配置的计算机上都会优于作者的结果。

结束语

其实上面的强大威力只是boost的冰山一角,如果你不自己去体会,你很难想象到boost的强大威力。在boost里还有很多使用的库,比如格式化输出,字符串拆解,类型转换等,这些库使用起来也比较方便,大家可以自行参考boost文档。在这些库中还有两个库需要自行编译,他们是Pythonthread库,而且这些库的编译需要专门的工具Jam,所以我们在编译这些库的时候还要编译jam工具,而编译jam工具也不是一件快乐的事情,麻烦同样出现在如果你安装了多个编译器,如果读者有兴趣可以自己试一下。

不过BCB6并不支持全部boost库,从boost提供的编译器支持表可以看到[2]BCB6还是有相当多的库不支持的,支持最好的是gcc/g++的编译器,但也不是全部支持。希望borland下一个将要发布的C++编译器可以支持更多C++标准。


[1] 其实还有其他类型的包,但在windows系统下,你最好下载zip

[2] Boost提供的编译器支持表是针对BCB5的,对于BCB6的支持作者并没有详细测试,如果读者有兴趣可以自己测试boost附带的测试代码。

在C++Builder6上使用Boost正则表达式库

  正则表达式是一种模式匹配形式,它通常用在处理的文本程序中。比如我们经常使用的grep工具,还是perl语言都使用了正则表达式。传统的C++处理正则表达式是非常麻烦的,这也成为很多其他语言爱好者的笑...
  • jjdragon
  • jjdragon
  • 2008年04月11日 16:43
  • 1027

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

http://www.wuzesheng.com/?p=965 写在前面:本文是《深入浅出C/C++中的正则表达式库》系列的第二篇,如果对本文感兴趣,相信你也会对《深入浅出C/C++中的正则表达式库...
  • Eric_Wilson
  • Eric_Wilson
  • 2015年11月15日 16:33
  • 1625

#墙裂推荐Boost regex# C,C++11,Boost三种regex库性能比较

在最近的一个项目中,发现之前的正则匹配模块对于长字符串匹配性能损失比较厉害,因此对长字符串下的各种正则匹配进行了略微研究并附有实例。本文参考了博客http://www.cnblogs.com/pmar...
  • we_izheng
  • we_izheng
  • 2014年11月06日 17:54
  • 5712

【C++多线程编程】Boost线程库

Boost线程库 Bill Kempf 译:伐木工 标准C++线程即将到来。CUJ预言它将衍生自Boost线程库,现在就由Bill带领我们探索一下Boost线程库。 就...
  • yockie
  • yockie
  • 2014年05月26日 00:31
  • 8449

Mac OS上安装Boost C++ Libraries

在安装Mac OS上安装 gearman 时,提示没有找到 boost,需要先安装Boost C++ Libraries.安装步骤如下: 1.在www.boost.org下载最新的Boost C+...
  • olivor
  • olivor
  • 2014年02月22日 19:56
  • 5219

关于C++ Boost库的使用

Boost介绍: Boost库是为C++语言标准库提供扩展的一些C++程序库的总称。   Boost库由Boost社区组织开发、维护。其目的是为C++程序员提供免费、同行审查的、可移植的程序库。B...
  • jonahzheng
  • jonahzheng
  • 2013年09月27日 23:15
  • 2890

Boost C++ 库入门

简介: Boost C++ 库(Libraries)是一组扩充C++功能的经过同行评审(Peer-reviewed)且开放源代码程序库。大多数的函数为了能够以开放源代码、封闭项目的方式运作,而授权于B...
  • sinat_20265495
  • sinat_20265495
  • 2016年09月06日 15:04
  • 9407

C++ 建立本地网络服务器 (Boost.Asio库)

详细的注释讲解利用Boost库建立服务器,最终自己也写了一个具有并发功能的boost服务器,可供直接调用。...
  • CSND_Ayo
  • CSND_Ayo
  • 2017年03月12日 05:37
  • 1775

C++ Boost 正则表达式用法(转自:吴碧宇的cnblog)

 先看一个网上经典的例子。#include "stdafx.h"#include #include #include #include #include using namespace std;usi...
  • wzqcongcong
  • wzqcongcong
  • 2011年05月08日 22:48
  • 6431

boost——正则表达式

前面一篇文章《编程思想之正则表达式》中讲了正则表达式的编程思想和各种语言下的使用,我们都知道C++标准库自带的正则表达式非常难用,而boost对一个功能进行了拓展,前面一篇文章《boost——入门指南...
  • luoweifu
  • luoweifu
  • 2015年02月01日 22:24
  • 1742
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在C++ Builder6上使用Boost正则表达式库
举报原因:
原因补充:

(最多只允许输入30个字)