织梦CMS - 轻松建站从此开始!

罗索

PCRE---c里面的正则表达式 使用简介

落鹤生 发布于 2010-04-12 20:30 点击:次 
工作要求设计一个翻译引擎,主要是负责VPN日志的翻译,原始日志利用PCRE分段然后替换相应字段,即翻译成需要的格式字符串。
TAG:

工作要求设计一个翻译引擎,主要是负责VPN日志的翻译,原始日志利用PCRE分段然后替换相应字段,即翻译成需要的格式字符串。引擎简单示意图如下:

 

 

这边利用到PCRE,PCRE只提供按照标准正则表达式进行匹配分段,并不提供字符串替换的功能。所以翻译引擎除了调用PCRE进行匹配外,还需要自己写替换程序。

对于PCRE,我们只需要调用简单的两个函数pcre_compile和pcre_exec就可以了,只要匹配成功,就可以返回相应的数值。这里主要解释下pcre_exec这个函数,实际写这个引擎时,这个函数出了不少bug。

函数原型:

       int pcre_exec(const pcre *code, const pcre_extra *extra,
            const char *subject, int length, int startoffset,
            int options, int *ovector, int ovecsize);
函数参数:

         code         Points to the compiled pattern
         extra        Points to an associated pcre_extra structure,
                        or is NULL
         subject      Points to the subject string
         length       Length of the subject string, in bytes
         startoffset Offset in bytes in the subject at which to
                        start matching
         options      Option bits
         ovector      Points to a vector of ints for result offsets
         ovecsize     Number of elements in the vector (a multiple of 3)

注意到 ovector这个in 数组, 如果pcre执行匹配分段后, 比如abc123bac用正则表达式进行分段后取得三个段:abc、123、bac,那么pcre_exec返回值应该是4,那么ovector这个int类型数组定义时,容量应该定义大于4*3=12,这样pcre_exec调用才不会出错,除了要大于12这个数外,还要注意到ovecsize应该是3的倍数。

在这个翻译引擎实际编码测试中就吃了这个亏,原来只定义ovecsize=30,出现了一些日志翻译失败的情况,查了下是分段过多,后来直接定义ovecsize=100,又出现原来可以翻译的一些日志变得不能翻译,最后查文档仔细看了下才知道这个值应该>分段*3,而且还要是3的倍数。

O(∩_∩)O哈哈~,本来一天写好的翻译引擎,最后测试花了一周时间来找bug除bug

 


 

(linzhangkun)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201004/9082.html]
本文出处:百度博客 作者:linzhangkun
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容