Regular Expressions 为什么回溯会成为陷阱?

示例

回溯可能由可选的量词或替代结构引起,因为正则表达式引擎将尝试探索每条路径。如果您运行的正则表达式a+b对aaaaaaaaaaaaaa没有匹配,发动机会发现它非常快。

但是,如果您将正则表达式更改(aa*)+b为组合数,则组合数将快速增长,并且大多数(未优化的)引擎将尝试探索所有路径,并且将花很长时间才能尝试找到匹配项或引发超时异常。这称为灾难性回溯

当然,这(aa*)+b似乎是一个新手错误,但这是在说明问题,有时您会遇到同样的问题,但模式会更加复杂。

正则表达式会发生更严重的灾难性回溯情况(x+x+)+y(您可能在此之前和此处已经看到过),这需要花费指数时间才能确定包含xs且没有其他内容(例如xxxxxxxxxxxxxxxxxxxx)的字符串与之不匹配。

如何避免呢?

尽可能具体,尽可能减少可能的路径。请注意,某些正则表达式匹配器不容易回溯,例如其中包含的awk或grep基于汤普森NFA的正则表达式匹配器。