Java Regex匹配除三个特定字符串之外的任何内容

chr*_*ina 18 java regex

鉴于此类Java Regex代码:

Pattern pattern = Pattern.compile("[^(bob)(alice)(kitty)]");
String s = "a";
Matcher matcher = pattern.matcher(s);

boolean bl = matcher.find();
System.out.println(bl);
Run Code Online (Sandbox Code Playgroud)

输出是false.为什么?正则表达式[^(bob)(alice)(kitty)]的任何东西匹配除bob,alicekitty.那么结果应该是真的吧?

anu*_*ava 26

因为你的正则表达式没有做你认为它应该做的事情.

将此正则表达式与否定前瞻一起使用:

Pattern pattern = Pattern.compile("^(?!bob|alice|kitty).*$");
Run Code Online (Sandbox Code Playgroud)

你的正则表达式:[^(bob)(alice)(kitty)]正在使用一个字符类,在一个字符类中没有组.

  • (?!bob|alice|kitty) 如果在输入开始时出现这三个单词中的任何一个,则表示负面预测意味着失败.
  • 重要的是使用锚点^$确保我们不匹配字符串的中间位置.
  • 如果你想避免在输入的任何地方匹配这三个单词,那么使用这个正则表达式:

    ^(?!.*?(?:bob|alice|kitty)).*$
    
    Run Code Online (Sandbox Code Playgroud)

RegEx演示