嗨,我想特别了解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在语义上有所不同吗?
答案 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。