Java 模式不返回最左边的匹配

标签 java regex

我必须解析程序的输出以搜索错误。错误提示如下:

[(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)"(.+?) 将找到 abcd .

关于Java 模式不返回最左边的匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12851029/

相关文章:

php - 正则表达式匹配单词组和先前匹配的单词组的部分

sql-server - 如何在 PATINDEX 模式参数中转义下划线字符?

java - Eclipse 中的 GlassFish 4.1 错误 java.io.FileNotFoundException : null/config/domain. xml(文件或目录不存在)

java - 如何用java创建图像编辑器?

java - 为什么java正则表达式失败

javascript - 如何通过书写系统(SCRIPT)匹配unicode?

javascript - 数字、破折号和方括号的正则表达式验证

java - 参数未从 HTML 表单传递到 MySQL(通过 Tomcat、Eclipse(IDE)、Servlet 和 Java Bean)

java - 无法从运行@myIpaddress :6379 的哨兵获取主地址

java - 如何从antlr词法分析器中提取关键字