Regex для сопоставления строк между двойными кавычками, которые не содержат некоторые другие строки - PullRequest
2 голосов
/ 14 июня 2019

Как сопоставить слова между двойными кавычками в строках, не содержащих определенные слова

input:

  • System.log ("error");
  • new Exception("ошибка");
  • view.setText ("message");

Из вышеприведенного ввода я бы хотел игнорировать строки со словами log и Exceptionв них (с учетом регистра) и совпадают слова в двойных кавычках.

Ожидаемый вывод

  • сообщение

Я пытался использовать взгляд вперед безудача

(?s)^(?!log)".+"

Мне это нужно для поиска в IntelliJ с использованием регулярных выражений

Ответы [ 2 ]

2 голосов
/ 14 июня 2019

В вашем шаблоне (?s)^(?!log)".+" отрицательный прогноз не содержит квантификатора, поэтому он будет утверждать, что то, что непосредственно после начала строки, не log

Что вы можете сделать, это использовать квантификатор.* с чередованием, совпадающим с log или Exception и добавлением границ слов \b, чтобы они не были частью большого слова.

Тогда вы можете использовать отрицательные классы символов [^"] дляне используйте двойную кавычку и используйте группу захвата ([^"]+) для значения между двойными кавычками.

^(?!.*\b(?:log|Exception)\b)[^"]*"([^"]+)"

В Java:

String regex = "^(?!.*\\b(?:log|Exception)\\b)[^\"]*\"([^\"]+)\"";

Regex demo

Если вы хотите, чтобы точка соответствовала новой строке, вы можете добавить (?s) к шаблону.

0 голосов
/ 14 июня 2019

Я предполагаю, что это выражение, вероятно, будет работать для захвата message,

^(?!.*log.*|.*exception.*).*?"(.+?)".*

Демо 1

Пример

import java.util.regex.Matcher;
import java.util.regex.Pattern;

final String regex = "^(?!.*log.*|.*exception.*).*?"(.+?)".*";
final String string = "System.log(\"error\");\n"
     + "new Exception(\"error\");\n"
     + "view.setText(\"message\");";

final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE | Pattern.CASE_INSENSITIVE);
final Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println("Full match: " + matcher.group(0));
    for (int i = 1; i <= matcher.groupCount(); i++) {
        System.out.println("Group " + i + ": " + matcher.group(i));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...