正则表达式以匹配不包含其他字符串的双引号之间的字符串

时间:2019-06-14 15:58:56

标签: java regex

如何在不包含特定单词的行中匹配双引号之间的单词

输入:

  • System.log(“错误”);
  • 新的Exception(“错误”);
  • view.setText(“ message”);

在上述输入中,我想忽略其中带有logException单词(区分大小写)的行,并在双引号之间匹配单词。

预期产量

  • 消息

我一直在尝试不走运的前瞻性

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

使用regex在IntelliJ中进行搜索时需要此

2 个答案:

答案 0 :(得分:2)

在模式(?s)^(?!log)".+"中,否定的超前行为不包含量词,因此它将断言在字符串开头之后直接不是log

您所能做的就是使用一个量词.*并交替使用以匹配logException并添加单词边界\b以防止它们成为较大的一部分字。

然后,您可以使用否定字符类[^"]来不匹配双引号,并使用捕获组([^"]+)作为双引号之间的值。

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

在Java中:

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

Regex demo

如果要使点与换行符匹配,则可以在模式前加(?s)

答案 1 :(得分:0)

我的猜测是,该表达式可能适用于捕获message

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

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