【发布时间】:2019-08-31 12:11:51
【问题描述】:
我试过这个正则表达式:
ab(cd|c)*d
在 regex101 和 RegExr 网站中。它与此文本完全匹配:
abcdcdd
现在让我们在正则表达式中交换 "cd" 和 "c":
ab(c|cd)*d
当我在网站上尝试这个正则表达式时,我发现这个正则表达式 不完全匹配相同的文本。
为什么正则表达式引擎无法识别ab(cd|c)*d 和ab(c|cd)*d 相同,如何说服ab(c|cd)*d 匹配最长的字符串?
正则表达式:ab(cd|c)*d
在 13 步骤中匹配的完整文本:abcdcdd
正则表达式:ab(c|cd)*d
在 9 步骤中匹配的部分文本:abcdcdd
【问题讨论】:
-
“为什么正则表达式引擎无法识别
ab(cd|c)*d和ab(c|cd)*d是相同的”。好吧,因为正如您所观察到的,它们不相同... -
如果
d是可选的,您可以省略管道并使d 可选。ab(cd?)*d。请注意,它会重复捕获组。 regex101.com/r/frwMkI/1 -
这里有很多非常技术性的答案,但简单的答案是正则表达式匹配
|(或语句)优先于最左边的模式,如果它永远不会尝试第二个模式第一场比赛,没有任何事情会导致比赛头回溯。在您的第二个示例中,c与c|cd匹配,因此我们退出“或”部分,然后匹配d,使cdd不匹配。 -
另请参阅Use the right regex flavor!,了解匹配最长序列的正则表达式引擎示例。
标签: regex