发生多个匹配时的java regex首选项

时间:2012-10-10 14:59:00

标签: java regex

嗨,我想特别了解OR运算符是如何“|”的在java正则表达式中工作。我刚开始使用它,大部分事情都不清楚。

假设我希望匹配分数和整数,即1/2,12/25形式的东西,以及形式为13,235等的东西。

我尝试了这两种模式:

pattern1 = Pattern.compile("\\d+|\\d+/\\d+"))
pattern2 = Pattern.compile("\\d+/\\d+|\\d+"))

在英语中,pattern1表示“数字或数字/数字”,而pattern2表示“数字/数字或数字”。

现在考虑这个输入字符串:

inputStr = "blah... 231/232 blah... 4 blah... 2"

对于pattern1,我发现了这些匹配:

[junit] found 231
[junit] found 232
[junit] found 4
[junit] found 2

对于pattern2,我发现了这些匹配:

[junit] found 231/232
[junit] found 4
[junit] found 2

现在,pattern1和pattern2之间的唯一区别是其匹配元素的顺序。当然,模式2是我想要的,因为它似乎“更喜欢”一个真正的派系而不是将它们分开。

所以对我来说最重要的问题是: 这种行为是可靠的/可预测的,还是对于不同的平台会有所不同?

但也只是好奇......这个问题也是: 我也发现它令人困惑,因为运算符“OR”应该与其参数对称,如加法。当1 + 2和2 + 1带有不同的语义时,你会想到人们会担心...这里有什么理由让pattern1和pattern2在语义上有所不同吗?

4 个答案:

答案 0 :(得分:6)

|不只是OR,它意味着“匹配第一件事,如果失败,则匹配第二件事。”

因此,您希望将该分数放在首位,因为它是首选形式。

答案 1 :(得分:4)

一个更有用的正则表达式是\\d+(/\\d+)?强制检查一组数字和一个由斜杠后跟数字组成的可选组。

答案 2 :(得分:2)

交替运算符就像一个懒惰的OR,因为它会匹配它所能做的第一件事。该主题还有其他帖子有助于澄清其行为:

Java regex alternation operator "|" behavior seems broken

Why order matters in this RegEx with alternation?

一般来说,所有正则表达式都以这种方式工作......除了POSIX。因此,可移植性不应该成为Java的关注点。

答案 3 :(得分:0)

|被称为交替,它提供了列出给定匹配的替代方案的能力,并将从左到右停止在匹配的第一个替代模式上。 AFAIK,这在我所使用的所有Java版本和编程语言/工具中非常一致:Java,Perl,Python,PHP,sed。