首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在使用带负值字符集的星号时没有回溯

为什么在使用带负值字符集的星号时没有回溯
EN

Stack Overflow用户
提问于 2019-03-25 09:08:44
回答 1查看 37关注 0票数 2

实际上,我理解什么是回溯,也就是引擎应用贪婪量化词时的状态,这会导致其他原子失效,因此引擎开始倒退到以前的状态,为了匹配剩余的原子,逐渐放弃匹配。

但是当我在这个"[^"]*"上使用这个模式"abcv时,我得到了意想不到的行为,我写它是为了检查失败时会发生什么。我希望引擎能走这一步:

  • 引擎与"匹配
  • 然后贪婪的量化否定字符集将匹配abcv
  • 引擎无法与上一次"匹配
  • 因此,它应该返回到[^"]*,一个接一个地放弃字符,试图匹配剩余的原子。

但是当我在regex101上测试这个引擎时,引擎不会回溯,但是每次它发生故障时,它都会从另一个位置重新启动。我在这里错过了什么?

这正是人们所期望的吗?如果是的话,会有人解释原因吗?

更新

我需要提到的是,".*"回溯,如果你检查引擎的步骤,你会发现它开始一个一个地给字符,但有问题的一个没有。为什么这个区别,虽然.*[^"]*都是贪婪的量词匹配相同的文本,但一个必须后退,另一个没有。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-25 09:38:09

PCRE在这里使用的是“自动拥有”优化,因为它“看到”除了两个"之外,没有任何其他字符匹配两个"。请参阅PCRE文档

PCRE_NO_AUTO_POSSESS 如果设置了此选项,则禁用“自动占有”。例如,这是一种优化,将a+b转换为a++b,以避免倒退到永远无法成功的a+。然而,如果使用标注,自动拥有意味着其中的一些永远不会被使用.如果希望匹配函数执行完全未优化的搜索并运行所有标注,则可以设置此选项,但它主要用于测试目的。

您可以通过在易查 "[^"]*"前加上(*NO_AUTO_POSSESS) PCRE动词来实现这一点:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55334397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档