<p>“matcher将输入字符串后退一个字符,然后再试一次”只是描述回溯,因此“then'llbacktrack”也是这么说的。既然你们两个关于贪婪的引语都说了同样的话,那两个都是正确的。(你的第三句话与贪婪无关。)</p>
<hr/>
<p>让我们举个例子。在</p>
<pre><code>'xxabbbbbxxabbbbbbbbb' =~ /([ab]*)bb/;
</code></pre>
<ol>
<li>在位置0尝试。
<ol>
<li><code>[ab]*</code>匹配0个字符“”。
<ol>
<li>在位置0,<code>bb</code>无法匹配⇒回溯。在</li>
</ol></li>
<li><code>[ab]*</code>无法匹配任何更少的⇒回溯。在</li>
</ol></li>
<li>在位置1尝试。
<ol>
<li><code>[ab]*</code>匹配0个字符“”。
<ol>
<li>在位置1,<code>bb</code>无法匹配⇒回溯。在</li>
</ol></li>
<li><code>[ab]*</code>无法匹配任何更少的⇒回溯。在</li>
</ol></li>
<li>在2号位置试试。
<ol>
<li><code>[ab]*</code>匹配6个字符“<code>abbbbb</code>”。
<ol>
<li>在位置8,<code>bb</code>无法匹配⇒回溯。在</li>
</ol></li>
<li><code>[ab]*</code>匹配5个字符“<code>abbbb</code>”。(退一步)
<ol>
<li>在位置7,<code>bb</code>无法匹配⇒回溯。在</li>
</ol></li>
<li><code>[ab]*</code>匹配4个字符“<code>abbb</code>”。(退一步)
<ol>
<li>在位置6,<code>bb</code>匹配。
<ol>
<li>成功。在</li>
</ol></li>
</ol></li>
</ol></li>
</ol>
<p>所以1美元是“abbb”。(不是<code>abbbbbbb</code>。“贪婪”并不意味着“可能的最长匹配”。)</p>
<hr/>
<p>现在,让我们看看如果我们让“*”非贪婪会发生什么。在</p>
^{pr2}$
<ol>
<li>在位置0尝试。
<ol>
<li><code>[ab]*?</code>匹配0个字符“”。
<ol>
<li>在位置0,<code>bb</code>无法匹配⇒回溯。在</li>
</ol></li>
<li><code>[ab]*</code>无法再匹配⇒回溯。在</li>
</ol></li>
<li>在位置1尝试。
<ol>
<li><code>[ab]*?</code>匹配0个字符“”。
<ol>
<li>在位置1,<code>bb</code>无法匹配⇒回溯。在</li>
</ol></li>
<li>^{⇒任何回溯都无法匹配。在</li>
</ol></li>
<li>在2号位置试试。
<ol>
<li><code>[ab]*?</code>匹配0个字符“”。
<ol>
<li>在位置2,<code>bb</code>无法匹配⇒回溯。在</li>
</ol></li>
<li><code>[ab]*?</code>匹配1个字符“<code>a</code>”。(添加一个)
<ol>
<li>在位置3,<code>bb</code>匹配。
<ol>
<li>成功。在</li>
</ol></li>
</ol></li>
</ol></li>
</ol>
<p>所以1美元是“a”。在</p>
<hr/>
<p>具体的实现作为一个优化可能会做不同的事情,只要它给出的结果与这里介绍的一样。您可以看到Perl使用</p>
^{3}$