为什么在使用带有否定字符集的星标时没有回溯

时间:2019-03-25 09:08:45

标签: regex pcre

实际上,我了解什么是回溯,即引擎应用贪婪量词时的状态,这会导致其他原子失败,因此引擎开始回溯到先前的状态,以便逐渐匹配剩余的原子

但是当在此"[^"]*"上使用此模式"abcv时,我遇到了意外的行为,我将其编写为检查故障时会发生什么。我希望引擎采取以下步骤:

  • 引擎匹配"
  • 然后贪婪量化的否定字符集将与abcv匹配
  • 引擎无法匹配最后一个"
  • 因此它应该回溯到[^"]*以便逐个放弃字符以匹配其余原子。

但是当我在regex101上测试它时,引擎不会回溯,但是每次失败时它都会从另一个位置重新开始。所以我在这里想念什么?

这正是我们所期望的吗?如果是这样,有人可以解释原因吗?

  

更新

我需要提到".*"的回溯,如果您检查引擎步骤,您会发现它开始一个接一个地提供字符,但没有出现问题。为什么.*[^"]*都是贪婪的量词,但它们与相同的文本匹配,但其中一个必须回溯,而另一个却不匹配,所以为何如此不同。

1 个答案:

答案 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

enter image description here