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);

Выходной сигнал false. Зачем? Регулярное выражение [^(bob)(alice)(kitty)] соответствует любым вещам, кроме bob, alice или kitty. Тогда результат должен быть правдой, верно?

Ответ 1

Потому что ваше регулярное выражение не делает то, что, по вашему мнению, должно делать.

Используйте это регулярное выражение с Отрицательным взглядом:

Pattern pattern = Pattern.compile("^(?!bob|alice|kitty).*$");

Ваше регулярное выражение: [^(bob)(alice)(kitty)] использует класс символов, а внутри класса символов нет групп.

  • (?!bob|alice|kitty) - отрицательный lookahead, который означает потерю соответствия, если какое-либо из этих трех слов появляется при начале ввода.
  • Важно использовать привязки ^ и $, чтобы убедиться, что мы не сопоставляем их с серединой строки.
  • Если вы хотите избежать сопоставления этих трех слов в любом месте ввода, используйте это регулярное выражение:

    ^(?!.*?(?:bob|alice|kitty)).*$
    

Демо-версия RegEx