代码之家  ›  专栏  ›  技术社区  ›  n1nsa1d00

测试以下regex模式时,为什么preg\u匹配空字符串?

  •  1
  • n1nsa1d00  · 技术社区  · 7 年前

    我组建了一个 regex 模式以匹配以下格式表示命令的字符串:

    !<name of command>\s+<possible parameters separated with commas>
    

    !<name of command>
    

    这个 正则表达式 现在看起来像这样:

    ^!(\w+)\s+([\w,\s]+\w+)$|^!(\w+)$
    

    当我使用 preg_match 要根据我的模式测试最终字符串,请执行以下操作:

    $res = "!add"
    preg_match('~^!(\w+)\s+([\w,\s]+\w+)$|^!(\w+)$~',$res,$match);
    

    这个 $match 返回的数组有4个意外条目。

    array(4) {
    [0]=>
    string(11) "!addhhgnhgj"
    [1]=>
    string(0) ""
    [2]=>
    string(0) ""
    [3]=>
    string(10) "addhhgnhgj"
    }
    

    两个奇怪地匹配空字符串,另两个匹配完整字符串和第三个捕获组(正如我所期望的)。什么时候 $res 等于 "!add param1, param2" ,则, $匹配 按预期正好有3个条目。

    为什么在测试没有参数的命令字符串时会出现上述情况?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Community CDub    5 年前

    数字与捕获组相关。

    您的输入字符串与替换的第二方匹配 ^!(\w+)$ 。它在索引中存储整个匹配 0 输出阵列的 1 2 索引对应于捕获未捕获的替换的第一方的组,第三方包含索引中的内容 3

    这就是 1. 2. 索引为空。

    ^!(\w+)\s+([\w,\s]+\w+)$|^!(\w+)$
      --#1-   -----#2------    --#3-