Php preg#u match不';不包括最终可选匹配的值

Php preg#u match不';不包括最终可选匹配的值,php,Php,也许我做得不对:我写了这个,等着在我的正则表达式中有可选的匹配项 preg_match('/^(\d+)([A-Z]+)?-(\d+)?([A-Z]+)?$/i', $groupe, $matches); list($match, $debutChiffre, $debutLettre, $finChiffre, $finLettre) = $matches; 因此,匹配2、3和4是可选的。如果2为空而3为空,则2将是空数组。但如果最后一个选项为空,则没有$matches[4]。如果3和4都为

也许我做得不对:我写了这个,等着在我的正则表达式中有可选的匹配项

preg_match('/^(\d+)([A-Z]+)?-(\d+)?([A-Z]+)?$/i', $groupe, $matches);
list($match, $debutChiffre, $debutLettre, $finChiffre, $finLettre) = $matches;
因此,匹配2、3和4是可选的。如果2为空而3为空,则2将是空数组。但如果最后一个选项为空,则没有
$matches[4]
。如果3和4都为空,则它将在
$matches[2]
处停止。我希望每个括号都有一个空字符串,因为在这之后,
list()
每次
$matches[4]
不存在时都会返回一个通知,因此它会尝试将不存在的值放入
$finLettre

要删除这些通知,有没有比在
list()
之前添加更好的方法

编辑:我认为正则表达式就足够了,但如果需要示例:

5A-9B
将给出一个包含5个元素的
$matches
数组(完整匹配和4个括号)

5-9B
将给出一个包含5个元素的
$matches
数组(
$matches[2]
是一个空字符串,因为没有字母)

5A-9
将给出一个包含4个元素的
$matches
数组(
preg\u match
忽略最后一个不匹配的括号,而如果后面至少有一个匹配项,它将放入空字符串以与括号顺序一致)

5-
将给出一个包含2个元素的
$matches
数组


由于此行为,下一个
list()
会获取未设置的变量并因此引发通知。

您可以将
$matches
合并到具有默认值的数组中。因此,如果匹配被命中,它将替换默认值:

<?php
preg_match('/^(\d+)([A-Z]+)?-(\d+)?([A-Z]+)?$/i', $groupe, $matches);
$matches = $matches + [[], '', '', '', ''];
list($match, $debutChiffre, $debutLettre, $finChiffre, $finLettre) = $matches;

如果您给我们一些您想要匹配的示例,可能会有所帮助,
<?php
preg_match('/^(\d+)([A-Z]+)?-(\d+)?([A-Z]+)?$/i', $groupe, $matches);
$matches = $matches + [[], '', '', '', ''];
list($match, $debutChiffre, $debutLettre, $finChiffre, $finLettre) = $matches;