我形成了一个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个条目符合预期。
为什么在测试命令的字符串后跟没有参数时会发生上述情况?
答案 0 :(得分:2)
您的输入字符串与交替^!(\w+)$
的第二面匹配。它将整个匹配存储在输出数组的索引0
中,1
和2
索引对应于捕获未捕获的第一侧交替的组,第三个包含索引{{ 1}}。
这就是3
和1
索引为空的原因。
2