正则匹配After到逗号间无-ing单词的实现 原正则错误原因及修复
原正则的问题
- 你写的
\bAfter\b.*(?!\w+ing)+,里的.*是贪婪匹配,会直接吞掉After到逗号前的所有内容,等执行到(?!\w+ing)负向预查的时候,已经走到了逗号前面的位置,这时候后面根本没有字符可以匹配\w+ing,所以这个预查永远为真,自然所有带After到逗号的内容都会被匹配。 - 负向零宽断言后加
+量词没有任何意义,零宽断言匹配的是位置,重复多少次校验的都是同一个位置,根本实现不了逐个检查区间内所有单词的效果。
正确实现方案
你需要在匹配每一个字符的时候,都校验后续不会出现-ing结尾的单词,修正后的正则如下:
\bAfter\b(?:(?!\w+ing\b)[^,])+,
逻辑说明
\bAfter\b:匹配完整独立的单词After,避免误匹配包含After的其他长单词(?:(?!\w+ing\b)[^,])+:非捕获组,循环匹配符合要求的字符:(?!\w+ing\b):负向预查,确保当前位置之后不会出现以ing结尾的完整单词[^,]:匹配除了逗号之外的任意字符
- 最后的
,:匹配区间终点的逗号,确保只匹配到After之后第一个逗号为止
匹配效果
- 不匹配:
After sitting down, he began to talk.(区间内存在sitting) - 不匹配:
After finally sitting down, he began to talk.(区间内存在sitting) - 匹配:
After he sat down, he began to talk.(区间内无-ing结尾的单词)
完全符合需求。
内容的提问来源于stack exchange,提问作者wyc
相关产品推荐
相关产品推荐

