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

时间:2013-03-07 17:12:09

标签: php regex

我最近一直在玩正则表达式,当我在php中使用preg_match_all时,有一件事对我来说不起作用。

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

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

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

我很感激有关这种情况的任何亮点。 :)

1 个答案:

答案 0 :(得分:4)

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

  • 提升起始位置 - 如果匹配在索引i处无法成功,将从索引i+1开始再次尝试,这将持续到达到字符串的结尾。
  • 回溯 - 如果在正则表达式中使用重复或替换,则正则表达式引擎可以丢弃不成功匹配的一部分,并通过使用更少或更多的重复或者使用不同的元素再次尝试交替。

原子团阻止回溯,但它们不会影响提升起始位置。

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