0

我必须解析程序的输出来搜索错误。错误表示为:

[(FieldName/Value) = (短语/ What is Up John Carl? ) 失败的规则字母数字] [(FieldName/Value) = ( newLabel / Óscar's IPad ) 失败的规则非法字符]

每行可能有多个错误,对于每个错误,我都想检索粗体字/句子。为了做到这一点,我正在创建一个正则表达式,如下所示:

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

所以它不会返回两场比赛,只是一场。它将第二组与字符串的其余部分匹配,而不是停在第一组"failed rule"。我想这是由于(.+)模式中的第一个,但问题是任何东西都可以进入那里,所以我需要(.+). 任何想法如何做到这一点?

4

3 回答 3

1

正如您在本教程 (.+)末尾看到的那样是Greedy,因此它将搜索适合正则表达式的最大子字符串,例如在"(ab)(cd)"正则表达式(.+)中将返回ab)(cd

你想要的是Reluctant 量词 (.+?)(后面有?标记+)。由于该正则表达式将尝试找到与您的正则表达式匹配的最小子字符串

"(ab)(cd)"with(.+?)会找到aband cd

于 2012-10-12T03:35:43.853 回答
0

您应该能够使量词不贪婪。你用“?”做这个 象征。

static Pattern p = Pattern.compile(s1 + "(\\w+)/(.*?)" + s2 + "(.*?)" + s3);

看看 SO 中的另一个例子:

Java中的非贪婪正则表达式

于 2012-10-12T03:23:04.433 回答
0
Pattern p = Pattern.compile(s1+"(\\w+)/(.*?)" + s2 + "(.*?)" + s3);
于 2012-10-12T03:21:01.203 回答