我必须解析程序的输出以搜索错误。错误提示如下:
[(FieldName/Value) = (phrase/What is Up John Carl?) failed rule alphanumeric] [(FieldName/Value) = (newLabel/Óscar's IPad) failed rule illegalchars]
每行可能有多个错误,对于每个错误,我想检索粗体的单词/句子。为此,我创建了一个正则表达式,如下所示:
static String s1 = Pattern.quote("[(FieldName/Value) = (");
static String s2 = Pattern.quote(") failed rule");
static String s3 = Pattern.quote("]");
static Pattern p = Pattern.compile(s1 + "(\\w+)/(.+)" + s2 + "(.+)" + s3);
while (matcher.find()) {
String token = matcher.group(1);
sb.append("#");
sb.append(token);
token = matcher.group(2);
sb.append("#");
sb.append(token);
token = matcher.group(3).trim();
sb.append("#");
sb.append(token);
}
但是输出是:
#phrase#What is Up John Carl?) failed rule alphanumeric] [(FieldName/Value) = (newLabel/Óscar's IPad#illegalchars
所以它不会返回两场比赛,只返回一场。它将第二组与字符串的其余部分进行匹配,而不是在第一个“失败的规则”处停止。我想这是由于模式中的第一个 (.+)
造成的,但问题是任何东西都可以进入其中,所以我需要 (.+)
。有什么想法如何做到吗?
最佳答案
正如您在 this tutorial 末尾所读到的那样(.+)
是贪婪,因此它将搜索适合正则表达式的最大子字符串,例如 "(ab)(cd)"
正则表达式 (.+)
将返回 ab)(cd
.
你想要的是勉强量词(.+?)
(+
后面有?
标记) 。感谢该正则表达式将尝试找到与您的正则表达式匹配的最小子字符串
"(ab)(cd)"
与 (.+?)
将找到 ab
和 cd
.
关于Java 模式不返回最左边的匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12851029/