2013-03-07 88 views
5

我最近一直在玩正则表达式,有一件事情不像我预期的那样,当我在php中使用preg_match_all。正则表达式原子分组似乎不工作preg_match_all()

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

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

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

我希望能够解决这种情况。 :)

回答

4

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

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

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

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

+0

谢谢,这说明了一切。 ;) – Neob91 2013-03-07 19:14:30