在正则表达式中,什么是回溯/反向引用?

80

什么是正则表达式回溯?

您能提供一个例子吗?


假设backtrace=回溯,类似的问题:哪个正则表达式需要回溯? - Marcel Jackwerth
1
在http://www.regular-expressions.info/catastrophic.html上有一些很好的示例,并附有完整的解释。 - bkzland
1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
129

回溯引用和回溯是两件不同的事情。前者是在代码后面使用捕获结果,例如:

(['"]).*?\1

这将匹配单引号或双引号括起来的字符串(忽略转义字符)。它使用反向引用来引用开放符号(单引号或双引号),以便可以在结尾处进行匹配。

另一方面,回溯是正则表达式在匹配过程中自然情况下发生的,当匹配失败时。例如,如果我正在匹配表达式

.+b

与字符串相比较

aaaaaabcd

然后它将首先在 .+ 上匹配 aaaaaabc,并将 b 与剩余的 d 进行比较。这会失败,因此它会回溯一点,并为 .+ 匹配 aaaaaab,然后将最后一个 bc 进行比较。这也失败了,因此它再次回溯,并尝试对 .+ 使用 aaaaaa,然后将 bb 匹配成功。


3
请看以下链接,可以找到更详细的答案:https://community.appway.com/screen/kb/article/checking-strings-avoiding-catastrophic-backtracking-1482810891360#:%7E:text=Catastrophic%20backtracking%20is%20a%20condition,the%20string%20to%20not%20match。在正则表达式中避免“灾难性回溯”是一个重要问题。这种情况会导致正则表达式匹配字符串的性能下降,并可能耗尽计算资源。为了避免这种情况的发生,需要编写高效的正则表达式,其中包括使用非贪婪限定符、避免回溯和使用原子组等技术。 - Nazeel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,