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

时间:2014-04-09 13:46:56

标签: java regex intellij-idea

我想创建一个只允许类名不以Impl结尾的正则表达式。我读过“没有结束”可以使用负向前瞻(?!)进行测试,但我找不到有效的(Java)正则表达式。

我试过

[A-Z][A-Za-z\d]*?(?!Impl)

但匹配SomeImpl,不应该是这种情况。

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

1 个答案:

答案 0 :(得分:5)

否定前瞻不会起作用,因为 - 使用*?(懒惰的零或更多)量词 - 它会在S处检查并在前方找不到Impl所以匹配成功。

如果您更改为贪婪的量词(将*更改为*?),它仍会失败,因为您将位于字符串的末尾 - 没有“前方”可查看。< / p>

相反,您希望后面使用负面外观来检查以前的内容,即

[A-Z][A-Za-z\d]*(?<!Impl)

(根据模式的使用位置,您可能还是不希望$

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


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

! mystring.endsWith('Impl')