在C++ Builder6上使用Boost正则表达式库
2005-10-08 11:24
281 查看
在C++ Builder6上使用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.bat命令开始编译,这里请大家注意了,如果你的计算机上同时安装了BCB5,请一定要把path设置成为BCB6的bcc32.exe程序所在的目录,否则可能使用BCB5的make程序,这样虽然能编译但最后不能使用。 编译过程相当耗时,你需要耐心等待,最终编译完成,会在[%Boost]\Libs\RegEx\Build目录生成一个BCB6目录,在这个目录生成了很多lib文件和dll文件,把所有dll文件复制到windows系统目录,所以lib文件复制到bcb6\lib目录。如果你不想这么麻烦的复制文件,可以在编译时加入install参数,就像这样make –fBcb6.bat install,不过作者还是比较喜欢前一种方式,这样我可以知道到底生成了什么文件。现在编译已经完成了,你可以体现boost的神奇魅力了。 一个测试程序 在BCB6中创建console程序,编写下列代码: #include #include #include #include int main() { using namespace boost; using namespace std; regex expression("\\s+href\\s*=\\s*\"([^\"]*)\"",regbase::normal|regbase::icase); string s=""; deque result; regex_split(std::back_inserter(result),s,expression); copy(result.begin(),result.end(),ostream_iterator(cout,"\n")); int c; cin>>c; return 0; } 设置BCB6 Project属性的Lib Path和Include Path为你安装boost的目录,运行你会看到结果: 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生成的大小为186K的html文件,这个文件中用到了很多 相关文章推荐
|