如何用正规表达式查找不以某些字符结尾的单词——一次回帖想到的

来源:互联网 发布:杜兰特2016季后赛数据 编辑:程序博客网 时间:2024/05/05 19:48

原贴子在这里:

http://topic.csdn.net/u/20100205/16/33f62568-ad66-435b-a3b5-99da746e6dde.html?seed=1920623080&r=63305046#r_63305046

经过整理,心得如下:


为了说明问题方便,缩短测试用例,要求是找出不以'ly'结尾的单词。
txt = 'thy38ly thy38 ly'
一开始写的正则表达式是用的顺序否定环视


意思也很直接了当:用/b界定单词,前面由至少一个/w组成,且不以ly结尾。但匹配结果是
['thy38ly', 'thy38', 'ly']
经过反复思考发现,上面的意思只是从人的思维角度出发去考虑的,在匹配过程中应该是一个从左到右逐个试验的过程(而不是先将一个单词界定好,再去判断单词是否满足条件):
先从/b开始,匹配一个单词的开头,然后匹配t,满足/w+,后面又不跟ly,但不满足之后的/b,即不是单词的结尾。随即放弃这个结果,/w+前进一个字符,又匹配了h,又以同样的理由放弃,...,依次前进到8,显然8不满足不以ly结尾这个条件,放弃。/w+继续前进到l,满足后面不跟ly的条件,但后面不是/b,/w+继续到y,发现完全满足条件,OK,匹配!

现在我将reg0的/b限制去掉,可以看到很清楚:

结果是:
['t', 'h', 'y', '3', '8l', 'y', 't', 'h', 'y', '3', '8', 'l', 'y']
很清楚,它没有匹配8,但可以匹配8l。

最后来看看正确的表达式:


结果是:
['thy38']
这里使用了一个逆序否定环视,当/w+匹配到thy38ly中的最后一个y时,没问题,但在末尾的/b就无法匹配了,因为/b的前面出现了ly。

由此我想是不是可以这么说:*、+的后面不要使用顺序否定环视功能?因为*、+几乎总能忽略了它,这时应该改用逆序否定环视。

说得不对的地方,请高手多多批评!

原创粉丝点击