如何在不包含特定单词的行中匹配双引号之间的单词
输入:
在上述输入中,我想忽略其中带有log
和Exception
单词(区分大小写)的行,并在双引号之间匹配单词。
预期产量
我一直在尝试不走运的前瞻性
(?s)^(?!log)".+"
使用regex在IntelliJ中进行搜索时需要此
答案 0 :(得分:2)
在模式(?s)^(?!log)".+"
中,否定的超前行为不包含量词,因此它将断言在字符串开头之后直接不是log
您所能做的就是使用一个量词.*
并交替使用以匹配log
或Exception
并添加单词边界\b
以防止它们成为较大的一部分字。
然后,您可以使用否定字符类[^"]
来不匹配双引号,并使用捕获组([^"]+)
作为双引号之间的值。
^(?!.*\b(?:log|Exception)\b)[^"]*"([^"]+)"
在Java中:
String regex = "^(?!.*\\b(?:log|Exception)\\b)[^\"]*\"([^\"]+)\"";
如果要使点与换行符匹配,则可以在模式前加(?s)
。
答案 1 :(得分:0)
我的猜测是,该表达式可能适用于捕获message
,
^(?!.*log.*|.*exception.*).*?"(.+?)".*
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));
}
}