[更新了答案]
^(?!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
答案 0 :(得分:3)
答案 1 :(得分:3)
@vks建议的关于^.*(?<!hede)$
解决方案的一些话:在一种情况下会很好 - 使用占有量词和.*
,.*+
。更新的正则表达式将如下所示:
(?s)^.*+(?<!hede)$
^
此外,内联修饰符(?s)
可用于强制.
匹配换行符号,以便我们还可以检查多行字符串是否以hede
结尾。
加号符号会产生巨大差异。由于前面带有(?<!hede)
模式的.*
后瞻是每次检查hede
时缺席经过测试,这个正则表达式不太稳定。占有量词将确保在整个字符串/行匹配后不会发生回溯,并且只有在它之后才会执行1次hede
缺席检查。
作为替代方案,您可以在开头使用否定前瞻权来检查字符串是否以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
答案 2 :(得分:2)