[更新了答案]
- 不以“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
最佳答案
关于^.*(?<!hede)$
的一些话@vks 建议的解决方案:在一种情况下会很好 - 使用 所有格量词和 .*
, .*+
.更新后的正则表达式如下所示:
(?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
关于java - 正则表达式:不以 "hede"结尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33211288/