正则表达式原子分组在preg中似乎不起作用

我最近一直在玩正则表达式,当我在php中使用preg_match_all时,有一件事情没有按预期工作。

我在http://www.solmetra.com/scripts/regex/index.php使用在线正则表达式工具。

我使用的正则表达式是/(?>x|y|z)w/ 。 我正在使它与abyxw匹配。 我期待它失败,但它会成功,并匹配xw

我期待它会失败,因为使用了原子分组,这从我从多个来源读取的内容防止了回溯。 我所期望的恰恰是引擎试图将y与交替匹配并成功。 后来,它试图匹配w与正则表达式字面w和失败,因为它遇到x 。 然后它会正常回溯,但不应该在这种情况下,由于原子分组。 因此,从我所知道的情况来看,它应该继续努力使y与这个原子团体相匹配。 但事实并非如此。

我将不胜感激这种情况。 :)


这有点棘手,但是当正则表达式找不到匹配时,可以尝试执行两件事:

  • 提前开始位置 - 如果匹配不能在索引i处成功,则将再次尝试从索引i+1 ,并且这将继续,直到到达字符串的末尾。
  • 回溯 - 如果在正则表达式中使用重复或交替,则正则表达式引擎可以丢弃部分不成功的匹配,并通过使用更少或更多的重复或交替中的不同元素再次尝试。
  • 原子团体阻止回溯,但不影响前进的起始位置。

    在这种情况下,当引擎试图与y匹配作为第一个字符时,匹配会失败,但是它会继续前进,并将xw看作字符串的剩余部分,这将匹配。

    链接地址: http://www.djcxy.com/p/74771.html

    上一篇: Regex atomic grouping does not seem to work in preg

    下一篇: capturing group? What does (?:) do?