【问题标题】:Regex atomic grouping does not seem to work in preg_match_all()正则表达式原子分组似乎在 preg_match_all() 中不起作用
【发布时间】:2013-03-07 17:12:09
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: php regex


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢,这一切都清楚了。 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    相关资源
    最近更新 更多