Java Pattern不返回最左边的匹配

时间:2012-10-12 01:31:22

标签: java regex

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

  

[(FieldName / Value)=(短语 / 什么是John Carl?)失败的规则字母数字] [(FieldName / Value )=( newLabel / Óscar的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"处停止。我想这是由于模式中的第一个(.+),但问题是任何东西都可以进入,所以我需要(.+)。任何想法怎么做?

3 个答案:

答案 0 :(得分:1)

正如您在this tutorial (.+)末尾可以阅读的是贪婪,因此它会搜索适合正则表达式的最大子字符串,例如在"(ab)(cd)"中正则表达式(.+)将返回ab)(cd

你想要的是不情愿的量词 (.+?)?之后有+标记。多亏了正则表达式将尝试找到与你的正则表达式匹配的最小子字符串

带有"(ab)(cd)"

(.+?)会找到abcd

答案 1 :(得分:0)

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

答案 2 :(得分:0)

你应该能够使量词非贪婪。你用“?”做到这一点符号。

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

看一下SO中的另一个例子:

Non-greedy Regular Expression in Java