正则表达式不匹配以"Impl"结尾的单词

dea*_*mon 0 java regex intellij-idea

我想创建一个正则表达式,只允许类名不以Impl.我读到"没有结束"可以用负面的前瞻来测试(?!),但我找不到工作(Java)正则表达式.

我试过了

[A-Z][A-Za-z\d]*?(?!Impl)
Run Code Online (Sandbox Code Playgroud)

但它匹配SomeImpl,不应该是这样的.

什么正则表达式不匹配以Impl?结尾的类名?

Pet*_*ton 5

负向前瞻不会起作用,因为 - 使用*?(懒惰的零或多)量词 - 它将检查SImpl立即找不到,因此匹配成功.

如果你改变为贪婪的量词(*改为*?)它仍然会失败,因为你将在字符串的末尾 - 没有"前方"可以看.

相反,你要使用负的外观后面,检查以前的内容,即

[A-Z][A-Za-z\d]*(?<!Impl)
Run Code Online (Sandbox Code Playgroud)

($根据模式的使用位置,您可能想要或不想要它)

旁注:这里没有直接相关,但有用的是(在Java正则表达式中)lookbehind必须具有有限的宽度 - 您不能使用*+量词,而必须使用有限的数字量词,例如{0,99}


但除非模式本身很重要(或者你在必须使用正则表达式的上下文中工作),一个更简单的选项是String.endsWith,如下所示:

! mystring.endsWith('Impl')
Run Code Online (Sandbox Code Playgroud)