我要配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
我要配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
2条答案
按热度按时间vpfxa7rd1#
我认为这是对\1所做的事情的误解。它不会重用该模式,就好像它是您放在括号中的表达式的占位符一样。相反,它匹配在第一捕获组中被 * 捕获的任何内容。
在你的情况下,你的模式将符合例如。这一点:
标签:https://regex101.com/r/M8u6eO/1
如果您的正则表达式引擎支持它,您可以使用“?1”。
标签:https://regex101.com/r/OytMlt/1
这实际上将重用模式而不是匹配。
xuo3flqw2#
反向引用不起作用,因为它捕获了整个时间字符串,包括“AM”或“PM”部分。由于两个时间字符串具有不同的“AM”或“PM”部分,因此反向引用不匹配。
要修复正则表达式并使用反向引用,您可以仅捕获时间部分(小时和分钟),并对小时和分钟部分使用单独的反向引用。下面是一个工作正则表达式:
Regex细分:
请注意,使用此正则表达式,您不会验证第一部分是否为“AM”,第二部分是否为“PM”。如果你想确保这一点,你可以像下面这样修改正则表达式:
此正则表达式确保第一部分以“AM”结束,第二部分以“PM”结束。