5

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

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

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

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

我希望能对这种情况有所了解。:)

4

1 回答 1

4

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

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

原子组防止回溯,但它们不影响推进起始位置。

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

于 2013-03-07T17:28:30.510 回答