我想找到所有不以“:”结尾的表达式 我试图那样做:
[a-z]{2,}(?!:)
在此文本上:
foobar foobaz:
foobaz
foobaz:
问题在于,它只是删除了“:”之前的最后一个字符,而不是整个匹配项。 这是示例:https://regex101.com/r/jtLRvz/1
如何获得整个正则表达式的否定超前工作?
答案 0 :(得分:2)
当[a-z]{2,}(?!:)
与baz:
匹配时,[a-z]{2,}
一次抓取2个或更多小写ASCII字母(baz
),并且负向查找(?!:)
立即检查字符在右边。它是:
,因此引擎会问自己是否有一种以其他方式匹配字符串的方法。由于{2,}
可以匹配两个字符,而当前不匹配三个字符,因此它backtracks并找到有效的匹配项。
在前瞻模式中添加a-z
,以确保2个或更多小写ASCII字母之后的字符不是字母,也不是冒号:
[a-z]{2,}(?![a-z:])
^^^
请参见regex demo
如果您的正则表达式引擎支持possessive modifiers或atomic groups,则可以使用它们来防止回溯进入[a-z]{2,}
子模式:
[a-z]{2,}+(?!:)
(?>[a-z]{2,})(?!:)