windows下C/C++的正则表达式库之GNU Regex Library

最近在做一个windows的项目时,遇到使用正则表达式的情形。我们的项目基于别人的linux项目,在linux中系统本身提供了一个标准的实现,只要include<regex.h>即可。为了和linux版本一致,我们也只有使用一样的GNU正则表达式库(GNU Regex Library)。

在C/C++中常用的正则表达式库有GNU Regex Library, Boost.Regex, PCRE, PCRE++。这四个库中,后面两个是有关系,其它都是各自己独立的,是不同的实现。x下面有关于windows下可用的正则表达式库的比较说明:

(1). 最省事的是 ATL 里面自带的 CAtlRegExp。不过对 POSIX 标准支持很差,而且非常慢。
(2). boost,名气很大,但是过于臃肿,而且速度也不快。
(3).以前微软研究院有个小组搞过一个greta,号称速度是boost的7倍多,不过03年以后就再也没更新了。在 VC8 以上版本编译需要稍作修改。兼容性不错。
(4). VBScript.RegExp。兼容性和速度都很好,尤其是速度上出人意料地击败了greta,比较复杂的规则比greta快了1倍不止。而且是Windows系统内置,不用像其它库还需要链接一个几百KB的lib。
(5).TRE:这个是在搜Google的RE2的时候搜到的。因为RE2 暂时还不能在Windows上编译,所以找来了这个替代品。算法类似Google的RE2,不过测试下来感觉还不成熟,匹配有遗漏。实测的速度和greta差不多,比VBScript.RegExp慢。
(6).PCRE:这个才是王道,WebKit的JavaScriptCore就是用得它,测试下来速度太震撼了,先我对VBScript.RegExp的性能已经很满意了,结果没想到PCRE的速度还要快10多倍……唯一的缺点是不支持wchar_t,所以wchar_t字符串需要先转换成char。但是还是够快了。

这里先简单介绍下GNU Regex Library。

1. 什么是GNU正则表达式库(GNU Regex Library) ?
GNU正则表达式库是glibc(GNU C Library)的一部分,它提供与POSIX标准兼容的正则表达式匹配的接口。
这里是其主页:http://www.gnu.org/s/libc/manual/html_node/Regular-Expressions.html
(1) 下载该库的源代码点这里:gnuregex0_13 
里面是正则库的.c实现文件,在vs下会出现一些错误

error C2660: “regcomp”: 函数不接受 3 个参数
error C2660: “regerror”: 函数不接受 4 个参数
error C2660: “regexec”: 函数不接受 5 个参数

(2) 下载该库的dll库点这里:http://download.csdn.net/source/1114458

是posix 在win32下regex的库,将.lib文件和.dll文件加放到工程中

(3) http://gnuwin32.sourceforge.net/packages/regex.htm

2. GNU Regex Library所提供的接口

(1) regcmp


(2) regexec



(3)regerror:


(4)regfree:



3. 使用GNU Regex Library的一些注意事项
(1)regcomp与regfree必须配对使用,要不然会造成内存泄漏(类比malloc/free, new/delete)
(2)regex_t结构:把字符串形式的正则表达式编译成regex_t这样的一个结构,方便后续的匹配工作
(3)regmatch_t结构:用来表示正则表达式中字符串中匹配的位置的结构,用起始位置的偏移量来表示的
(4)flags:用来配置匹配过程中的一些选项, 指定如何匹配,具体参见:http://www.opengroup.org/onlinepubs/007908799/xsh/regcomp.html
(5)使用该库需要包含的头文件:sys/types.h和regex .h。

如果我们是用VS创建的C++项目,在使用regex.h时需要注意,因为是C实现的,如果接口定义中没有

/* Allow the use in C++ code.  */
#ifdef __cplusplus
extern "C" {
#endif

#ifdef __cplusplus
}
#endif /* C++ */

则使用时需要

extern "C"{

#include "regex.h"

}。

如果接口定义有,则直接include即可。

4. GNU Regex Library使用举例



参考: http://blog.csdn.net/quaful/article/details/6460880

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

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值