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

原贴子在这里:

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。

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

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值