为什么这个正则表达式捕获会产生2个匹配?

Kim*_*Kim 3 php regex preg-match php-5.3

我不知道为什么除了输入之外还有2个匹配使用这个正则表达式,当我预期只有1个匹配.

preg_match(/_(\d(-\d){0,3})\./,$str,$matches);
Run Code Online (Sandbox Code Playgroud)

在此文件字符串格式上name_A-B-C-D.ext.

我期望得到像这样的单一比赛:

Example A
[0] => name_A-B-C-D.ext  
[1] => A-B-C-D

Example B
[0] => name_A-B-C.ext  
[1] => A-B-C
Run Code Online (Sandbox Code Playgroud)

但这是我得到的结果:

Example A
[0] => name_A-B-C-D.ext  
[1] => A-B-C-D
[2] => -D

Example B
[0] => name_A-B-C.ext  
[1] => A-B-C
[2] => -C
Run Code Online (Sandbox Code Playgroud)

我只希望捕捉AD它之前是否连字符.这段代码是可用的,我可以简单地忽略第二场比赛,但我想知道为什么它在那里.我只能假设它与我的两个捕获组有关.我的错误在哪里?

Mar*_*ers 8

是的,您获得了两次捕获,因为正则表达式中有两个捕获组.

为避免不必要的捕获,您可以使用非捕获组(?:...):

/_(\d(?:-\d){0,3})\./
Run Code Online (Sandbox Code Playgroud)