擅长:python、mysql、java
<p>我不得不承认这也让我很吃惊,但我在RegexBuddy中得到了相同的结果:它在经过一百万步后就放弃了尝试。我知道关于灾难性回溯的警告往往集中在嵌套量词上,但根据我的经验,交替使用至少同样危险。事实上,如果我将regex的最后一部分改为:</p>
<pre><code>'(?:[^']+|'')+'
</code></pre>
<p>……对此:</p>
^{pr2}$
<p>…它只需十一步就失败了。这是<a href="http://www.google.com/products/catalog?q=mastering%20regular%20expressions&oe=utf-8&rls=org.mozilla%3aen-US%3aofficial&client=firefox-a&um=1&ie=UTF-8&tbm=shop&cid=14133907573972946768&sa=X&ei=2dNsTv2oMu_ZiALdsdjDDg&ved=0CDgQ8wIwAw" rel="noreferrer">Friedl</a>的“展开循环”技术的一个示例,他将其分解如下:</p>
<pre><code>opening normal * ( special normal * ) * closing
' [^'] '' [^'] '
</code></pre>
<p>只要:</p>
<ol>
<li><code>special</code>和{<cd2>}永远不能匹配同一个东西</li>
<li><code>special</code>始终至少匹配一个字符,并且</li>
<li><code>special</code>是原子的(必须只有一种方法才能匹配)。在</li>
</ol>
<p>正则表达式将<em>失败</em>以匹配最小回溯,而<em>成功</em>根本没有回溯。另一方面,替代版本几乎可以保证回溯,在不可能匹配的情况下,随着目标字符串长度的增加,它会迅速失控。如果它在某些口味中没有过度回溯,那是因为它们有专门针对这个问题的优化,目前为止很少有口味能做到。在</p>