boost的regex 是还不错,就是太大了,链接化的时间太长,而且从网络了解的情况来看,还有写不太可靠!,于是转向伟大的PCRE。于是上网爬,看了好些网友的前车之见,直接开干!
取PCRE的服务器上下载最新的8.10版本,ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/解压后,查看其NON-UNIX-USE文件,里面有详细的非UNIX编译步骤。
按照说明将
config.h.generic->config.h
pcre.h.generic->pcre.h
在VS2008中建立一个空的Wi32 DLL工程,将config.h,pcre.h,ucp.h,pcre_internal.h拷贝到vs2008的Win32 DLL工程目录中(不要加入工程中,否则编译器会先pcre_internal.h(在各个pcre_*.c文件中,都是必须先编译config.h的),报莫名的错误)。之后考入所有的prce_*.c文件(将pcre_chartables.c.dist->pcre_chartables.c后也一起考入)。
打开config.h,在其头部加入:
#define NO_RECURSE
#define HAVE_STDINT_H 0
#define HAVE_INTTYPES_H 0
#define NO_RECURSE 的意思是让PCRE不要用递归,而是用堆辅助工作,这样可以避免PCRE一次解析大量字符串时栈崩溃。
#define HAVE_STDINT_H 0 #define HAVE_INTTYPES_H 0 的意思是让pcre_internal.h中关闭,如下选项:
#if HAVE_STDINT_H
#include <stdint.h>
#elif HAVE_INTTYPES_H
#include <inttypes.h>
#endif
在项目选项C++->Preprocessor中的Preprocessor Definitions中加入HAVE_CONFIG_H;_CRT_SECURE_NO_WARNINGS,由于PCRE还是用C的那套老字符串函数,而从VS2005以后,都要用*_s的安全函数,否则就要提升一堆warning,本人一向讨厌warning
,所以就加了。另外感觉PCRE非要搞HAVE_CONFIG_H这个选项,感觉有点多余,所有的C函数前面都有这个宏判断,多余!
这样就好了,一次编译通过。
(本人尝试把PRCE的各种CC及其对应的.h文件也加入工程,但是发现由于操作系统和编译环境的差异,各种错误很多,搞了半天也没有完全搞定,时间有限就不搞了。)
好了,加入这个时候假如直接用PCRE提供的C API来写程序,太痛苦了,于是在网上爬各种PCRE对应的C++ Wrapper:
http://www.adp-gmbh.ch/cpp/regexp/pcre/wrapper/index.html 这位老兄搞一个最简单的版本,功能还是差点。
http://pme.berlios.de/ 有PME的最新版本2.0.0,下载下来,将PME.h和PME.cpp也加入工程中,进行编译,发现其提供的其提供的例子都不能运行通过,跟踪代码发现其代码match函数内有一个大bug(直接吐血!!,这位仁兄在上传时也不搞清楚),m_marks数组居然不判断是否为空,就开整!,修改bug后运行其例子,终于可以用了。
http://www.daemon.de/PCRE pcre++这个封装类,看了一下其代码,非要把一个class的内容分为多个.cc文件,搞的巨复杂,于是耐心修改,而后将其浓缩为2个文件后加入工程中,费了2个多小时的时间终于,FIX了所有的errors和warnings。
真个过程中遇见了一个变态的警告(warning C4251: needs to have dll-interface to be used by clients of class)和错误(error C2470 "looks like function definition, but no parameter list),搞了好一会才搞定,要移植unix下的开源东东来windows上免费用,也不是那么容易啊,这就是现实。
好了,搞定了,可以在perl流派的正则表达式里面爽了!。。。。。。。。。。