实际上,我了解什么是回溯,即引擎应用贪婪量词时的状态,这会导致其他原子失败,因此引擎开始回溯到先前的状态,以便逐渐匹配剩余的原子
但是当在此"[^"]*"
上使用此模式"abcv
时,我遇到了意外的行为,我将其编写为检查故障时会发生什么。我希望引擎采取以下步骤:
"
"
[^"]*
以便逐个放弃字符以匹配其余原子。但是当我在regex101上测试它时,引擎不会回溯,但是每次失败时它都会从另一个位置重新开始。所以我在这里想念什么?
这正是我们所期望的吗?如果是这样,有人可以解释原因吗?
更新
我需要提到".*"
的回溯,如果您检查引擎步骤,您会发现它开始一个接一个地提供字符,但没有出现问题。为什么.*
和[^"]*
都是贪婪的量词,但它们与相同的文本匹配,但其中一个必须回溯,而另一个却不匹配,所以为何如此不同。
答案 0 :(得分:2)
PCRE在这里使用“自动拥有”优化,因为它“看到”没有办法在两个"
之间匹配"
以外的其他任何字符。参见PCRE docs:
PCRE_NO_AUTO_POSSESS
If this option is set, it disables "auto-possessification". This is an optimization that, for example, turns a+b into a++b in order to avoid backtracks into a+ that can never be successful. However, if callouts are in use, auto-possessification means that some of them are never taken. You can set this option if you want the matching functions to do a full unoptimized search and run all the callouts, but it is mainly provided for testing purposes.
通过在"[^"]*"
前面加上(*NO_AUTO_POSSESS)
PCRE动词,可以easily check: