正则表达式在模式上的负面预测

时间:2018-07-06 08:16:20

标签: regex

我想找到所有不以“:”结尾的表达式 我试图那样做:

[a-z]{2,}(?!:)

在此文本上:

foobar foobaz:
foobaz
foobaz:

问题在于,它只是删除了“:”之前的最后一个字符,而不是整个匹配项。 这是示例:https://regex101.com/r/jtLRvz/1

如何获得整个正则表达式的否定超前工作?

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 modifiersatomic groups,则可以使用它们来防止回溯进入[a-z]{2,}子模式:

[a-z]{2,}+(?!:)
(?>[a-z]{2,})(?!:)

请参见another regex demo