首页 文章

为什么这个正则表达式捕获组不会为每个匹配重复?

提问于
浏览
2

我在regex101.com测试这个

正则表达式: ^\+([0-9A-Za-z-]+)(?:\.([0-9A-Za-z-]+))*$

测试字符串: +beta-bar.baz-bz.fd.zz

字符串匹配,但“匹配信息”框显示只有两个捕获组:

MATCH 1 1. [1-9]beta-bar2. [20-22]zz``

我期待所有这些捕获:

  • beta-bar

  • baz-bz

  • fd

  • zz

为什么句点之间的每个标识符都不被识别为自己捕获的组?

1 回答

  • 2

    发生这种情况的原因是因为在捕获组上使用量词并且捕获n次时,只有最后捕获的文本存储在缓冲区中并在最后返回 .

    您可以使用简单的正则表达式 preg_split 来代替匹配这些部分:

    $str = "+beta-bar.baz-bz.fd.zz";
    $a = preg_split('/[+.]/', $str, -1, PREG_SPLIT_NO_EMPTY);
    

    IDEONE demo

    结果:

    Array
    (
        [0] => beta-bar
        [1] => baz-bz
        [2] => fd
        [3] => zz
    )
    

相关问题