如何用正规表达式查找不以某些字符结尾的单词——一次回帖想到的
来源:互联网 发布:杜兰特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。
由此我想是不是可以这么说:*、+的后面不要使用顺序否定环视功能?因为*、+几乎总能忽略了它,这时应该改用逆序否定环视。
说得不对的地方,请高手多多批评!
- 如何用正规表达式查找不以某些字符结尾的单词——一次回帖想到的
- 如何用grep的正则表达式匹配搜索回文单词
- 以are结尾的四字单词
- 正则匹配以xx开头以xx结尾的单词
- 正则表达式匹配所有以小写字符开头的单词
- 关于正规表达式的元字符
- 查找不可见字符的正则表达式
- 查找以指定字符开始和结尾的子串数量
- 读国外程序员的回帖想到的
- 正则表达式:不包含某些指定的单词(超级难的正则式,前无古人哦)
- 过滤所有以<开头以>结尾的标字符正则
- 如何用PhotoShop去掉图片上的某些文字
- 正则表达式不以某字符串结尾
- 电话号码的正规表达式!
- 常用的正规表达式
- 正规表达式的使用
- notepad++ 查找最后一列以0结尾的行
- struts2的action类名不能以"action"字符结尾
- 包设计原则
- 心很痛
- 设计模式----Template Method(模板方法)
- 行走在消逝中 [仅仅作为留念而已]
- ASP.NET(C#)经典采集代码
- 如何用正规表达式查找不以某些字符结尾的单词——一次回帖想到的
- 189之狠与189之短及中移动的反制策略
- 老婆需要这样疼
- Webgame的市场分析和前景展望
- 类设计原则
- 网络架构:分层还是分块有学问
- 实现拖动文件到文本框,自动读出文件内容
- PHP编程方式的重新思索(上)
- 微观经济学之定价策略(上):价格歧视