3

嗨,我想特别了解 OR 运算符“|” 在 java 正则表达式中工作。我刚开始使用它,大多数事情对我来说都不清楚。

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

我试过这两种模式:

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

在英语中,pattern1 表示“digits OR digits/digits”,而 pattern2 表示“digits/digits OR digits”。

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

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 之间的唯一区别是其匹配元素的顺序。当然,pattern2 是我想要的,因为它似乎“更喜欢”一个真正的派系而不是将它们分开。

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

但也只是好奇......这个问题也是:我也觉得它令人困惑,因为运算符“OR”应该关于它的论点是对称的,比如加法。当 1+2 和 2+1 带有不同的语义时,你会想象人们会担心……这里的 pattern1 和 pattern2 有什么不同的语义吗?

4

4 回答 4

7

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

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

于 2012-10-10T15:02:47.543 回答
4

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

于 2012-10-10T15:07:16.473 回答
2

交替运算符就像一个惰性或,因为它将匹配它可以匹配的第一件事。有关该主题的其他帖子有助于澄清其行为:

Java 正则表达式交替运算符“|” 行为似乎坏了

为什么在这个 RegEx 中顺序很重要?

一般来说,所有正则表达式的工作方式......除了POSIX。因此,可移植性在 Java 中不应该是一个问题。

于 2012-10-10T15:05:59.527 回答
0

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

于 2012-10-10T15:04:36.317 回答