终于用boost的正则库写完了一个文本转换

     过程真是艰苦啊,对文本结构分析的不全面,一度让我以为BOOST的REGEX库有缺陷。还好,最终证明是自己的问题,呵呵,否则重新用其他方法实现的话,真要让人崩溃了。

     但是其中还有一点小问题,类似如下的正则

#define REG_LINE "[ ]*"                                /*标记头*//
                 "((//w+)|"                                        /*元素名情况1  例如:TYPE*//
                 "(/"([^/"]*?)/"))"                                /*元素名情况2  例如:"wms_title"*//
                 "[ ]+"                                    /*空格*//
                 "((/"([^/"]*?)(?=/"))|"                                /*值情况1  例如: "rw:sdf" 也包含了下面的情况2*//
                 "((-?//w+[ ]*)*?(?=//r//n))|"                    /*值情况3  例如: 129 -35 222*//
                 "(//S+))"                                        /*值情况4  ../mapfile/ */

红色部分的表达式获取的是 "sdfsadfsadfdf”  这种形式的内容。但是若引号不想获取,改成 ((?=/")([^/”]*?)(?=/”)) 这种形式,则正则会产生中断

若改成 [ ]+(?<=/”)(([^/”]*?(?=/”)) ,则正则不错出现中断,但是获取的内容有误

最后的解决方法只能是对获取的 字符串单独进行处理,用此正则 "((?<=/")([^/"]*?)(?=/"))"进行获取,若是"sdfsadfsadfdf”的形式,则获取引号内的内容,若不是这种形式,不处理。

不限次数的嵌套正则写法:

"(1|2|3|4)((?!1|2|3|4|END)(.*?)|(?R))*END"

1,2,3,4是可以作为开头元素的关键字,END是结尾标志,此正则配合迭代器可以获取所有并列的最外层嵌套,如果在用一个循环,则可以获取每一个嵌套的内容,相当之方便。

用了正则表达式对文本的处理确实相当方便。但同时也是一把双刃剑,考虑的情况不周全导致正则表达式设计的不完善,就可以导致许多莫名奇妙的错误,很难检测出来。

我就是吃了这个苦,排错过程相当郁闷,一度认为是BOOST的语法原因,差点都怀疑BOOST的REGEX是否真的如传说中的那么强大了。

哎,满脸都是泪。

 

 

ps:

似乎对于这种表达式:  [ ]*NAME//b[ ]+((//w+)|((?=/")[^/"]*?(?=/")))[ ]*//r//n    红色部分有问题,不能获取直接获取引号中间的内容,只能分2个步骤,先连引号一起获取,然后在单独获取引号内的内容。与上面粉红色标记的情况一样

 .

 

 

对于“|”符号的机制,比如   (/S+|/(.*?/)[ ]*?(?=/n))        boost::regex 里的处理机制是,若第一种(/S+)能匹配,则立刻停止或条件,即使第2种情况(/(.*?/)[ ]*?(?=/n)) 能匹配更长的字符串,比如 (('[ADMINCODE]' eq '330523') or ('[ADMINCODE]' eq '330483')or('[ADMINCODE]' eq '330682'))  ,此正则只能匹配(('[ADMINCODE]'  ,若想匹配整个,则将2种情况互换一下位置即可。即 若正则A和B,A是B的子集,不要写成B|A, 而是 A|B

 

 

 

以上的一些问题在转载的《深入浅出正则表达式》里面介绍机制的时候都提到了一些产生的缘由。比如:"?=","|"

 

 

对于这样的正则 :"CONFIG[ ]+?(/"[^(/"|//n)]*?/")[ ]*?/"([^(/"|//n)]*?)/"[ ]*?//r//n"

 

其中红色的部分不算做是一个匹配子集,即此正则内,可以获取的就两个 括号内的内容,其中第一个括号是 (/"[^(/"|//n)]*?/")

第2个括号是 ([^(/"|//n)]*?)  类似于 (?=abc)  ,括号也不算做一个子集

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值