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

本文关键词:正则表达式 c++ python 软件

正则表达式是一种模式匹配形式,它通常用在处理的文本程序中。比如我们经常使用的grep工具,还是perl语言都使用了正则表达式。

正则表达式是一种模式匹配形式,它通常用在处理的文本程序中。比如我们经常使用的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]LibsRegExBuild目录,直接敲入make –fbcb6.mak命令开始编译,这里请大家注意了,如果你的计算机上同时安装了BCB5,请一定要把path设置成为BCB6的bcc32.exe程序所在的目录,否则可能使用BCB5的make程序,这样虽然能编译但最后不能使用。

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

一个测试程序

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

#include<deque>

#include<iostream>

#include<algorithm>

#include<boost/regex.hpp>

int main()

{

using namespace boost;

using namespace std;

regex expression("s+hrefs*=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;

}

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

index.html

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

代码的核心部分是:

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

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

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

正则表达式的书写规则

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


. (dot)


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


*


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


+


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


{}


指定可能的重复次数


例如:

ba* 匹配 b ba baa baaa等

ba+ 匹配 ba baa baaaaaaaaa等

ba 匹配 ba baa baaa baaaa baaaaa

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


s


匹配空格


w


匹配一个单词


d


匹配数字


()


有两种用法:

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

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

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

一个实际的例子

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

@People{

Age=19

Speek=”Hay,,how are you”

}

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

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

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

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

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

性能分析

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

为了节省篇幅,这里就不列出html代码了,不过可以告诉大家,这是一个又Word生成的大小为186K的html文件,这个文件中用到了很多<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毫秒,拆分得到1072个width属性值,我们可以看到boost的效率是非常高的,虽然与一些角本语言比起来解析速度还是慢,但已经可以满足大多数编程要求了。另外作者的计算机配置并不是非常高,相信拿到现在任何一台主流配置的计算机上都会优于作者的结果。

结束语

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

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


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

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

http://blog.csdn.net/xiang_521/article/details/8890084

原文地址:https://www.cnblogs.com/findumars/p/8306760.html

时间: 2024-11-13 08:50:18

在C++ Builder6上使用Boost正则表达式库的相关文章

ATL正则表达式库与CAtlRegExp的使用

正则表达式是最强大的文本解析工具之一, 在ATL中也提供了一些用于正则表达式的类库(CATLRegExp等),本文将简要说明这些类库的使用方法. 1.CATLRegExp类 声明: template <class CharTraits=CAtlRECharTraits> class CAtlRegExp; 初始化: 与微软的GRETA类库(微软研究院推出的另一个正则表达式类库)不同,CATLRegExp并没有在构造函数中提供初始化匹配字符串的方法,而是让使用者通过调用它的Parse()方法,使

站在巨人的肩膀上,C++开源库大全

程序员要站在巨人的肩膀上,C++拥有丰富的开源库,这里包括:标准库.Web应用框架.人工智能.数据库.图片处理.机器学习.日志.代码分析等. 标准库 C++ Standard Library:是一系列类和函数的集合,使用核心语言编写,也是C++ISO自身标准的一部分. Standard Template Library:标准模板库 C POSIX library : POSIX系统的C标准库规范 ISO C++ Standards Committee :C++标准委员会 框架 C++通用框架和库

编译 pcre - 开源的正则表达式(库)

PCRE百科介绍: PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库.这些在执行正规表达式模式匹配时用与Perl 5同样的语法和语义是很有用的.Boost太庞大了,使用boost regex后,程序的编译速度明显变慢.测试了一下,同样一个程序,使用boost::regex编译时需要3秒,而使用pcre不到1秒.因此改用pcre来解决C语言中使用正则表达式的问题 pcre库官网:http://www.pcre.o

Boost::thread库的使用

阅读对象 本文假设读者有几下Skills [1]在C++中至少使用过一种多线程开发库,有Mutex和Lock的概念. [2]熟悉C++开发,在开发工具中,能够编译.设置boost::thread库. 环境 [1]Visual Studio 2005/2008 with SP1 [2]boost1.39/1.40 概要 通过实例介绍boost thread的使用方式,本文主要由线程启动.Interruption机制.线程同步.等待线程退出.Thread Group几个部份组成. 正文 线程启动 线

thrift 编译调用boost动态库

In the project properties you must also set HAVE_CONFIG_H as force include the config header: "windows/confg.h" By default lib/cpp/windows/force_inc.h defines: #define BOOST_ALL_NO_LIB 1 #define BOOST_THREAD_NO_LIB 1 This has for effect to have

【regex】POSIX标准正则表达式库

在linux C 下面没有编译成功使用?号的非贪婪模式. 网上的一句话:the ? only works for Perl-based regexp, not for POSIX... 如果需要使用非贪婪模式匹配,可以使用boost的正则表达式库

boost 线程库

http://www.boost.org/Boost的安装step1.从www.boost.org下载boost库 step2 在 tools\build\jam_src目录下 运行build.bat来生成jamstep3 设置环境变量(后面的%PATH%要加) PATH=%boost的绝对路径%\tools\build\jam_src\bin.ntx86;%PATH% PATH=%boost的绝对路径%;%PATH% For Visial Studio 6.0SET MSVC_ROOT="VC

[C/C++11]_[初级]_[使用正则表达式库regex]

场景 正则表达式在处理非常量字符串查找,替换时能很省事,如果稍微复杂点的字符串匹配, 没有正则表达式还真做不出来. C++11 为我们提供了正则表达式库. 使用起来比boost的正则库方便. 搞Java 的一定觉得很搞笑,这都是Java的标配功能, 怎么C++11才支持这个库,vs2010 以才支持.建议在处理字符串搜索替换时,直接用正则吧,代码量少,快速. 参考 std::regex_replace std::regex_iterator Regular Expressions (C++) 说

boost标准库开发环境搭建

1.下载boost相关的库的安装包 网址:http://www.boost.org/ 其中1.55.0版本的下载地址是:http://sourceforge.net/projects/boost/files/boost/1.55.0/ 截图: 2.boost开发相关的软件: boost_1_55_0.tar.gz  Linux平台下面的boost源码包 boost_1_55_0.zip    Windows平台下面的boost源码包 boost_1_55_0-bin-msvc-all-32-64