Почему отрицание не работает здесь? - PullRequest
0 голосов
/ 28 мая 2018
String text = "$.example(\"This is the tes't\")";
final String quoteRegex = "example.*?(\"[^is].*?\")";
Matcher matcher0 = Pattern.compile(quoteRegex).matcher(text);
while (matcher0.find()) {
    System.out.println(matcher0.group(1));
}

Возвращает This is the tes't.Я ожидал, что не верну никакого результата из-за отрицания [^is], которое говорит, что не соответствует is.Тогда почему он возвращает This is the tes't?

Точно так же example.*?(\".*?\") регулярное выражение возвращает This is the tes't, но example(\".*?\") не почему?

1 Ответ

0 голосов
/ 28 мая 2018

[^is] не говорит, что не соответствует is, он говорит, что соответствует символу, который не i или s, и ваш пример имеет T после ", поэтому он соответствует.

Если вы хотите сопоставить ноль или более символов и исключить строку "is", вы можете сделать:

example.*?(\"(?:(?!is).)*?\")

Если вы хотите не совпадать с is сразу после "(что не , как в вашем примере):

example.*?(\"(?!is).*?\")

Вы также спрашиваете, почему example(\".*?\") не совпадает;это регулярное выражение совпадает только в том случае, если сразу после example стоит ", а в вашем примере - (.Вы можете сопоставить (, но все же захватить строку в кавычках с:

example\((\"...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...