VC使用DEELX正则引擎-DLL方式

本文介绍了如何在VC环境下使用DEELX,一个Perl兼容的正则表达式引擎,通过DLL方式进行文本匹配。DEELX具有简单易用的接口,支持多种高级特性,如命名分组和条件表达式。文章展示了如何加载DLL,获取函数指针并执行正则表达式匹配。

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上下载源码。

 

http://www.codeproject.com/KB/library/deelx.aspxs

options: -s single-line mode -m multi-line mode -i ignoreCase -G global -R from right to left -E extended-regexp pattern ERE -e ="PAT-regexp" -C ="strToOperate" -F fixed-strings fgrep -c ="num" print only a count of matching first lines per file -n force the prefixing filename on output -N without prefixing filename on output -o show only the part of the line that matched -f ="file" read regex patterns from file -q quiet suppress all normal output,stderr etc -O output file offsets, not text -x print line number with output lines -r recursively scan sub-directories -I select only non-matching lines -S ="replaceto" Match(regexp)-->replaceto -p ="bak-suffix-name",Modify file(S) directly,will create backup file(s) if bak- suffix-name is not null -d ="dir to search" default=currentDirectory,dir-str can't end with \",avoid esc ape " -X mask filename to be operated with regex -T only output filename and match num for per file search file:if set the -e arg and no (-C arg || stdin-pipe || inputfile),then ou tput filepath that match -ergx;if -o arg is set,output filenames only 从命令行中-C参数指定要处理的字符串: C:\>E:\MyProjects1117\deelxGrepSed\Debug\deelxgrep.exe -Chello2012 -e2\d+2 Line:1 Offset:5 hello2012 //output -o参数指定只输出匹配部分: C:\>E:\MyProjects1117\deelxGrepSed\Debug\deelxgrep.exe -Chello2012 -e2\d+2 -o 2012 从标准输入 管道里获取要处理的数据 C:\>help |E:\MyProjects1117\deelxGrepSed\Debug\deelxgrep.exe -e^V.+?\s -o VERT VE VER VER VERIFY VOL 从文件里读取数据处理,支持递归处理目录 E:\MyProjects1117\deelxGrepSed\Release>deelxgrep.exe -ewindows Boo-t.ini -i Boo-t.ini result : Line:3 Offset:45 (0)partition(1)\WINDOWS [operating sys Line:5 Offset:37 (0)partition(1)\WINDOWS="Microsoft Wind Line:5 Offset:56 DOWS="Microsoft Windows XP Professional -d指定目录,-r表示递归处理 -e指定要查找的表达式,如果没有带处理数据(即没有-C\管道输入\指定文件)但指定了目录,则会 处理目录下的目录名和文件名,并输出符合表达式的路径名称 E:\MyProjects1117\deelxGrepSed\Release>deelxgrep.exe -eboot.i*i -i -d"c:" -r c:\boot.ini E:\MyProjects1117\deelxGrepSed\Release>deelxgrep.exe -eboot.i*i -i -d"c:\\"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值