原贴子在这里:
经过整理,心得如下:
为了说明问题方便,缩短测试用例,要求是找出不以'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。
由此我想是不是可以这么说:*、+的后面不要使用顺序否定环视功能?因为*、+几乎总能忽略了它,这时应该改用逆序否定环视。
说得不对的地方,请高手多多批评!