[更新答案]
不以“ 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