DEELX 是一个在 C++ 环境下的与 Perl 兼容的正则表达式引擎。是 RegExLab 开展的一个研究开发项目。相比于GRETA很Boost来说是一个接口相对简单易用的正在引擎。其基本特点:
支持与 Perl 兼容的正则表达式语法。
支持 IGNORECASE, SINGLELINE, MULTILINE 等常见匹配模式。
兼容性强,能在 vc6, vc7, vc8, gcc, Turbo C++ 等大多数 C++ 环境编译。
支持命名分组,条件表达式,递归表达式等多种高级特性。(1.2版本新特点)
与 GRETA、boost 相比,DEELX 独到之处:
完全使用模版库编写,支持 char, wchar_t, int 等以及其他基类型版本。
全部代码位于一个头文件(.h)中, 比任何引擎都使用简单和方便。
支持从右向左匹配模式,可从文本结束位置向前搜索匹配。
可防止零长度子匹配循环无限次而产生的死循环。(1.2版本新特点)
这是RegExLab的说法。我们使用还是要根据自己的项目要求合理选择。后续将会做一个GRETA Demo,可做一些对比。DEELX本身只是由一个头文件构成,全是模板,里面实现了一个内部的内存管理模块,感兴趣的可以自己阅读。使用DLL需要一个头文件,DEELX也进行了封装。我们先看看头文件的内容。
首先定义一些标志位,默认是0。例如SINGLELINE,MULTLINE定义了单行和多行匹配。
封装一下DLL导出导入关键字,DLL源文件中使用的是__declspec(dllexport)。使用此DLL的源文件中应该使用__declspec(dllixport)。通过开关宏LIBDEELX_EXPORTS区分。
其后又用宏LOAD_DEELX_RUNTIME来区分是运行时或非运行时,运行时声明需要导出的函数表,非运行时使用typedef定义了许多函数指针类型,可以简化引入头文件时的工作。我们不选用。
函数指针类型:
VC中经常发现不一致的命名方式,Windows使用的匈牙利命名方式与源文件不符,而且我们做个简单的Demo用不着那么多函数指针。所有自己定义几个需要的即可。
__stdcall一定要放在括号内,不然编译器在第一个空格开始把后面的当做需要定义的,语法错误。
写一个main函数,首先加载DLL,然后获取DLL中的函数位置,相当于了初始化函数指针。然后验证正在表达式,最后卸载DLL。
如果没有__stdcall会怎么样?悲剧地看到这样的错误- The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.为什么呢?因为VC默认使用_cdecl,而DLL中使用的是_stdcall,栈到底谁清就搞乱了,能乱来么?
如果DLL名字写错了怎么样?悲剧地看到访问错误。为什么呢?因为函数指针都指向的0x0000000位置,当然错啦。
你可以从Codeproject上下载源码。
本文介绍了如何在VC环境下使用DEELX,一个Perl兼容的正则表达式引擎,通过DLL方式进行文本匹配。DEELX具有简单易用的接口,支持多种高级特性,如命名分组和条件表达式。文章展示了如何加载DLL,获取函数指针并执行正则表达式匹配。

1220

被折叠的 条评论
为什么被折叠?



