我想创建一个只允许类名不以Impl
结尾的正则表达式。我读过“没有结束”可以使用负向前瞻(?!)
进行测试,但我找不到有效的(Java)正则表达式。
我试过
[A-Z][A-Za-z\d]*?(?!Impl)
但匹配SomeImpl
,不应该是这种情况。
什么正则表达式与以Impl
结尾的类名不匹配?
答案 0 :(得分:5)
否定前瞻不会起作用,因为 - 使用*?
(懒惰的零或更多)量词 - 它会在S
处检查并在前方找不到Impl
所以匹配成功。
如果您更改为贪婪的量词(将*
更改为*?
),它仍会失败,因为您将位于字符串的末尾 - 没有“前方”可查看。< / p>
相反,您希望在 后面使用负面外观来检查以前的内容,即
[A-Z][A-Za-z\d]*(?<!Impl)
(根据模式的使用位置,您可能还是不希望$
旁注:这里没有直接相关,但有用的是(在Java正则表达式中)lookbehind必须具有有限的宽度 - 您不能使用*
或+
量词而且必须使用有限的数字量词,例如{0,99}
子>
但除非模式本身很重要(或者你在必须使用正则表达式的环境中工作),否则更简单的选项将是String.endsWith ,如下所示:
! mystring.endsWith('Impl')