为什么在测试以下正则表达式模式时preg_match匹配空字符串?

时间:2018-03-15 12:49:48

标签: php regex command

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

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

!<name of command>

regex现在看起来像这样:

^!(\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"时,$match正好有3个条目符合预期。

为什么在测试命令的字符串后跟没有参数时会发生上述情况?

1 个答案:

答案 0 :(得分:2)

数字与捕获组相关。

您的输入字符串与交替^!(\w+)$的第二面匹配。它将整个匹配存储在输出数组的索引0中,12索引对应于捕获未捕获的第一侧交替的组,第三个包含索引{{ 1}}。

这就是31索引为空的原因。

2