使用|时,这种奇怪的行为是怎么回事内()?

时间:2019-01-30 16:57:38

标签: regex regex-group

我正在使用正则表达式模式,这让我很头疼。 解决问题后,我遇到了一种我不理解的奇怪行为:

我首先要使用的子模式

\.(\d|\d\d)
当我提供测试字符串“ .20”时,

没有给我完全匹配,只有部分匹配“ .2”给我。但是,当我翻转它

(\d|\d\d)\.

给我完整的比赛“ 20”。当我提供测试字符串“ 20”时。 我不知道这种相反的行为是从哪里来的,这很简单。要么。 + 1位数字或。 + 2位数字。我没有使用^或$,因为测试字符串我已经按原样使用“ .20”或在其他文本中进行了尝试。

这是怎么回事?

2 个答案:

答案 0 :(得分:2)

在将字符串.20提供给正则表达式\.(\d|\d\d)时,正则表达式中的\.与字符串中的.相匹配。然后,它尝试将|的左侧,即\d2匹配,这同样成功。由于|的左侧已经匹配,因此它将不会尝试匹配|的右侧。因此,我们的最终匹配为0.2。如果正则表达式类似于\.(\d\d|\d),那么在输入0.20时,您将获得0.20的完全匹配项。

当您向正则表达式20.提供(\d|\d\d)\.时,它首先将|的左侧,即\d与数字2匹配。由于|的左侧已完全匹配,因此它不会尝试匹配|的右侧。现在,它尝试将\.与数字0匹配,但失败了。由于失败,发生了回溯,现在|的右侧,即\d\d20匹配,然后\..匹配。因此,您可以获得完全匹配的20.

答案 1 :(得分:0)

您尚未指定正在使用哪个正则表达式引擎或如何使用它,但是正则表达式匹配器不一定会尝试将模式与 whole 输入匹配或找到最长的匹配项。通常,他们对找到任何匹配感到满意,如果可能匹配多个匹配项,则哪个匹配项取决于引擎。记住这一点,请注意,通过使用模式的一位数字替代,输入的初始.2子字符串确实可以与模式匹配。

可以想象,第二个示例可以仅匹配0.而不匹配整个字符串。它确实匹配整个字符串的事实是正则表达式引擎的实现或您如何使用它的函数,或两者兼而有之。

如果要要求模式匹配整个输入(否则根本不匹配),请锚定

^(\.(\d|\d\d))$

在大多数正则表达式中,您会遇到方言^与输入(输入的零宽度)或输入的一行匹配,并且$与结尾的匹配。