正则表达式回溯选项:收缩还是扩大?

时间:2012-08-04 18:47:04

标签: regex backtracking

到目前为止,在我对正则表达式的研究中,我得出的结论是,每当发生回溯时,当前“在回溯位置”的令牌将尝试扩展(前提是它后面跟着一个懒惰的量词;比方说,最初抓住“x”的x *?会尝试抓住另一个x变为“xx”或缩小(仅提供它后面是一个贪婪的量词; x *,最初抓住“xxx”将尝试释放一个x持有“xx”)。我的理解是,这些行为严格取决于令牌之后的量词的类型。

但这与正则表达式教程的这一部分提供的信息有些矛盾:http://www.regular-expressions.info/catastrophic.html
作者给出了搜索字符串的一个例子 -

"1,2,3,4,5,6,7,8,9,10,11,12,13" and regex - "^([^,\r\n]*,){11}P".

他进一步指出:“如果找不到P,引擎仍然会回溯。但它只会回溯11次,每次[^,\r\n]无法展开超出逗号,强制正则表达式引擎立即执行11次迭代中的前一次迭代,而不尝试其他选项“。

这个词“扩展”是让我困惑的一个词。当令牌回溯时,令牌是否会尝试扩展?正则表达式是否应该写成这样:"^([^,\r\n]*?,){11}P",不会出现任何问题,但现在我想知道我是否得到了右后退的概念 或不。?

有人可以对此有所了解吗?

1 个答案:

答案 0 :(得分:1)

他所说的只是[^,\r\n]*永远不会消耗逗号之外的字符,这就是分隔符。

如果字符集不包含逗号,那么回溯量会增加灾难性,因为它是一个重复的子模式。