到目前为止,在我对正则表达式的研究中,我得出的结论是,每当发生回溯时,当前“在回溯位置”的令牌将尝试扩展(前提是它后面跟着一个懒惰的量词;比方说,最初抓住“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",
不会出现任何问题,但现在我想知道我是否得到了右后退的概念
或不。?
有人可以对此有所了解吗?
答案 0 :(得分:1)
他所说的只是[^,\r\n]*
永远不会消耗逗号之外的字符,这就是分隔符。
如果字符集不包含逗号,那么回溯量会增加灾难性,因为它是一个重复的子模式。