使用 | 时这种奇怪的行为是怎么回事?里面 ()?
What's going on with this weird behavior when using | inside ()?
我正在研究让我头疼的正则表达式模式。
在缩小问题范围后,我遇到了一个我不理解的奇怪行为:
我一开始想用的子模式
\.(\d|\d\d)
当我提供测试字符串“.20”时,没有给我完全匹配,只有部分匹配“.2”。但是当我翻转它时
(\d|\d\d)\.
给出完整匹配项“20”。当我提供测试字符串“20”时。
我不明白这种对立的行为从何而来,这很简单。任何一个 。 + 1 位数字或 . + 2 位数字。我没有使用 ^ 或 $ 作为测试字符串我已经尝试使用“.20”作为测试字符串,因为它是或隐藏在其他文本中。
这是怎么回事?
当您向正则表达式 \.(\d|\d\d)
提供字符串 .20
时,正则表达式中的 \.
匹配字符串中的 .
。然后它尝试匹配 |
的左侧,即 \d
与 2
,这也是成功的。由于|
的左边已经被匹配,所以不会尝试去匹配|
的右边。因此,我们有 0.2
的最终匹配。如果正则表达式类似于 \.(\d\d|\d)
,那么在输入 0.20
时,您将获得 0.20
.
的完整匹配项
当您向正则表达式 (\d|\d\d)\.
提供 20.
时,它首先匹配 |
的左侧,即 \d
与数字 2
。因为,|
的左边已经完全匹配,所以它不会尝试匹配 |
的右边。现在,它尝试将 \.
与数字 0
匹配,当然失败了。由于失败,回溯发生,现在 |
的右侧,即 \d\d
与 20
匹配,然后 \.
与 .
匹配。因此,你得到完整的匹配 20.
您尚未指定您正在使用哪个正则表达式引擎或如何使用,但正则表达式匹配器不一定会尝试将模式与 整个 输入匹配或查找最长的比赛。一般来说,找到 any 匹配就很满足了,如果有几个可能匹配到哪个就看引擎了。牢记这一点,请注意,您输入的初始 .2
子字符串确实可以通过使用模式的一位数替代项与模式匹配。
你的第二个例子可以想象,只匹配 0.
而不是整个字符串。它与整个字符串匹配的事实是正则表达式引擎实现的一个函数,或者你如何使用它,或者两者兼而有之。
如果你想要求模式匹配整个输入(或者根本不匹配),那么anchor it:
^(\.(\d|\d\d))$
在您会遇到的大多数正则表达式方言中,^
匹配输入或一行输入的(零宽度)开头,类似地,$
匹配结尾。
我正在研究让我头疼的正则表达式模式。 在缩小问题范围后,我遇到了一个我不理解的奇怪行为:
我一开始想用的子模式
\.(\d|\d\d)
当我提供测试字符串“.20”时,没有给我完全匹配,只有部分匹配“.2”。但是当我翻转它时
(\d|\d\d)\.
给出完整匹配项“20”。当我提供测试字符串“20”时。 我不明白这种对立的行为从何而来,这很简单。任何一个 。 + 1 位数字或 . + 2 位数字。我没有使用 ^ 或 $ 作为测试字符串我已经尝试使用“.20”作为测试字符串,因为它是或隐藏在其他文本中。
这是怎么回事?
当您向正则表达式 \.(\d|\d\d)
提供字符串 .20
时,正则表达式中的 \.
匹配字符串中的 .
。然后它尝试匹配 |
的左侧,即 \d
与 2
,这也是成功的。由于|
的左边已经被匹配,所以不会尝试去匹配|
的右边。因此,我们有 0.2
的最终匹配。如果正则表达式类似于 \.(\d\d|\d)
,那么在输入 0.20
时,您将获得 0.20
.
当您向正则表达式 (\d|\d\d)\.
提供 20.
时,它首先匹配 |
的左侧,即 \d
与数字 2
。因为,|
的左边已经完全匹配,所以它不会尝试匹配 |
的右边。现在,它尝试将 \.
与数字 0
匹配,当然失败了。由于失败,回溯发生,现在 |
的右侧,即 \d\d
与 20
匹配,然后 \.
与 .
匹配。因此,你得到完整的匹配 20.
您尚未指定您正在使用哪个正则表达式引擎或如何使用,但正则表达式匹配器不一定会尝试将模式与 整个 输入匹配或查找最长的比赛。一般来说,找到 any 匹配就很满足了,如果有几个可能匹配到哪个就看引擎了。牢记这一点,请注意,您输入的初始 .2
子字符串确实可以通过使用模式的一位数替代项与模式匹配。
你的第二个例子可以想象,只匹配 0.
而不是整个字符串。它与整个字符串匹配的事实是正则表达式引擎实现的一个函数,或者你如何使用它,或者两者兼而有之。
如果你想要求模式匹配整个输入(或者根本不匹配),那么anchor it:
^(\.(\d|\d\d))$
在您会遇到的大多数正则表达式方言中,^
匹配输入或一行输入的(零宽度)开头,类似地,$
匹配结尾。