regex回溯选项:缩小或展开



到目前为止,在我对regex的研究中,我得出的结论是,无论何时发生回溯,当前"处于回溯点"的令牌将尝试扩展(前提是后面跟着一个懒惰的量词;例如,最初抓取"x"的x*?将尝试抓取另一个x以变为"xx")或收缩(前提是下面跟着一个贪婪的量词;最初抓取"xxx"的x*将尝试释放一个x来保持"xx"。我的理解是,这些动作严格由标记后面的量词的类型决定。

但这在某种程度上与regex教程这一部分中提供的信息相矛盾:http://www.regular-expressions.info/catastrophic.html.
作者给出了一个字符串被搜索的例子——

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

他进一步指出:"如果找不到p,引擎仍然会回溯。但它只会回溯11次,每次[^,rn]都无法扩展到逗号之外,迫使正则表达式引擎立即进行11次迭代中的前一次,而不尝试进一步的选项"。

"扩展"这个词让我很困惑。当代币回溯时,它会在这一点上尝试扩展吗?如果regex是这样写的:"^([^,rn]*?,){11}P",,就不会有任何问题,但现在我想知道我是否正确地理解了回溯的概念
或者没有。?

有人能解释一下吗?

他所说的是[^,rn]*永远不会使用逗号以外的字符,逗号是分隔符。

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

最新更新