正则表达式:不以 "hede" 结尾

RegEx: does not end with "hede"

[已更新答案]

  1. 开始 "hede":^(?!hede).*$
  2. 包含 "hede": ^((?!hede).)*$
  3. 结束 "hede":(?s)^.*+(?<!hede)$

3 个表达式都有效。

正在检查:

Pattern p = Pattern.compile("(?s)^.*+(?<!hede)$");
assertTrue( p.matcher("hede obsolete").matches()); //ok 
assertTrue( p.matcher("obsolete hede obsolete").matches()); //ok
assertFalse(p.matcher("obsolete hede").matches()); //ok

您可以使用 lookbehind

^.*(?<!hede)$

或者您可以使用

^.*+(?<!hede)$

使用 @stribizhev

建议的所有格量词

您可以使用这个负面前瞻:

^(?!.*hede$).*$

RegEx Demo

关于@vks 建议的 ^.*(?<!hede)$ 解决方案的一些话:在一种情况下会很好 - 使用 占有量词和 .*.*+.更新后的正则表达式如下所示:

(?s)^.*+(?<!hede)$
       ^

此外,行内修饰符(?s)可用于强制.匹配换行符,这样我们也可以检查多行字符串是否以hede结尾。

加号有很大的不同。 因为 (?<!hede) 后面的 .* 模式正在检查 hede每次测试一个字符时,这个正则表达式都不太稳定。所有格量词将确保在整个 string/line 匹配后不会发生回溯,并且只有在它之后才会执行 1 次 hede 缺失检查。

作为替代方案,您可以在开始时使用否定前瞻来检查字符串是否以 hede 结尾(此版本可与 matcher.find 一起使用):

(?s)^(?!.*hede$)

或者,匹配不以 hede 结尾的整个 line/string:

(?s)^(?!.*hede$).*

regex demo

IDEONE demomatches() 的示例(末尾没有 $,因为整个字符串必须匹配):

System.out.println("A string with hede".matches("(?s)^(?!.*hede$).*")); // => false
System.out.println("A string without".matches("(?s)^(?!.*hede$).*")); // => true