RegEx:不以" hede"

时间:2015-10-19 09:44:41

标签: java regex lookaround

[更新了答案]

  1. 没有开始与" hede":^(?!hede).*$
  2. 包含" hede":^((?!hede).)*$
  3. 不会结束与&#34; hede&#34;:(?s)^.*+(?<!hede)$
  4. 所有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
    

3 个答案:

答案 0 :(得分:3)

您可以使用lookbehind

^.*(?<!hede)$

或者您可以使用

^.*+(?<!hede)$

具有@stribizhev

建议的占有量词

答案 1 :(得分:3)

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

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

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

加号符号会产生巨大差异。由于前面带有(?<!hede)模式的.*后瞻是每次检查hede时缺席经过测试,这个正则表达式不太稳定。占有量词将确保在整个字符串/行匹配后不会发生回溯,并且只有在它之后才会执行1次hede缺席检查。

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

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

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

(?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

答案 2 :(得分:2)

您可以使用此否定前瞻

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

RegEx Demo