regex 使用反向引用时无法匹配

vjrehmav  于 2023-05-08  发布在  其他
关注(0)|答案(2)|浏览(106)

我要配
9:00 AM to 5:00 PM
这是我的正则表达式,我试图用反向引用匹配结束的时间,它不工作
(\d(?::\d{2})?\s\wM)\sto\s\1
如果简单地替换反向引用就能使它匹配,为什么反向引用失败了?
(\d(?::\d{2})?\s\wM)\sto\s(\d(?::\d{2})?\s\wM)
我的问题是
如何使用反向引用来匹配两端的时间?
为什么我做的不起作用?
regexr.com/7dbki

vpfxa7rd

vpfxa7rd1#

我认为这是对\1所做的事情的误解。它不会重用该模式,就好像它是您放在括号中的表达式的占位符一样。相反,它匹配在第一捕获组中被 * 捕获的任何内容。
在你的情况下,你的模式将符合例如。这一点:

  • 上午9:00至上午9:00

标签:https://regex101.com/r/M8u6eO/1
如果您的正则表达式引擎支持它,您可以使用“?1”。

(\d:\d{2}?\s\wM)\sto\s(?1)

标签:https://regex101.com/r/OytMlt/1
这实际上将重用模式而不是匹配。

xuo3flqw

xuo3flqw2#

反向引用不起作用,因为它捕获了整个时间字符串,包括“AM”或“PM”部分。由于两个时间字符串具有不同的“AM”或“PM”部分,因此反向引用不匹配。
要修复正则表达式并使用反向引用,您可以仅捕获时间部分(小时和分钟),并对小时和分钟部分使用单独的反向引用。下面是一个工作正则表达式:

(\d(?::(\d{2}))?\s\wM)\sto\s\1

Regex细分:

  • (\d(?::(\d{2}))?\s\wM):捕获整个时间字符串,包括“AM”或“PM”部分。
  • \d:捕获小时部分。
  • (?::(\d{2}))?:(可选)捕获微小部分,包括结肠。
  • \s\wM:匹配“AM”或“PM”部分。
  • \sto\s:在两个时间字符串之间匹配“to”。
  • \1:反向引用第一个捕获的组(整个时间字符串)。

请注意,使用此正则表达式,您不会验证第一部分是否为“AM”,第二部分是否为“PM”。如果你想确保这一点,你可以像下面这样修改正则表达式:

(\d(?::(\d{2}))?\sAM)\sto\s(\d(?::\d{2})?\sPM)

此正则表达式确保第一部分以“AM”结束,第二部分以“PM”结束。

相关问题