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

Neo*_*b91 5 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与这个原子组相匹配.但事实并非如此.

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

And*_*ark 4

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

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

原子团可以防止回溯,但不会影响起始位置的前进。

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