[更新答案]


不以“ hede”开头:^(?!hede).*$
不包含“ hede”:^((?!hede).)*$
不以“ 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

最佳答案

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

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


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

加号有很大的不同。由于每次测试字符时,前面带有(?<!hede)模式的.*后面查找都会检查是否缺少hede,因此此正则表达式不太稳定。所有格量词将确保在匹配整个字符串/行之后不发生回溯,并且只有在对hede缺失进行1次检查之后,才可以进行回溯。

或者,您可以在开始时使用否定的超前查询来检查字符串是否以hede结尾(此版本可以与matcher.find一起使用):

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


或者,匹配不以hede结尾的整行/字符串:

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


regex demo

IDEONE demo,例如matches()(末尾没有$,因为整个字符串必须匹配):

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

08-25 23:09