我最近一直在玩正则表达式,当我在php中使用preg_match_all时,有一件事对我来说不起作用。
我在http://www.solmetra.com/scripts/regex/index.php使用在线正则表达式工具。
我正在使用的正则表达式是/(?>x|y|z)w/
。我正在匹配abyxw
。我期待它失败,但它成功了,并匹配xw
。
由于使用原子分组,我期待它失败,从我从多个来源读取的内容,可以防止回溯。我所期待的是引擎试图将y
与交替匹配并成功。稍后它会尝试将w
与正则表达式文字w
匹配并失败,因为它遇到x
。然后它通常会回溯,但在这种情况下,由于原子分组,它不应该回溯。因此,据我所知,它应该继续尝试将y
与此原子组匹配。但事实并非如此。
我很感激有关这种情况的任何亮点。 :)
答案 0 :(得分:4)
这有点棘手,但是当找不到匹配时,正则表达式可以尝试做两件事:
i
处无法成功,将从索引i+1
开始再次尝试,这将持续到达到字符串的结尾。原子团阻止回溯,但它们不会影响提升起始位置。
在这种情况下,当引擎尝试与y
匹配作为第一个字符时,匹配将失败,但随后它将继续,并将xw
视为字符串的剩余部分,会匹配。