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

时间:2012-04-07 15:05:44

标签: php regex preg-match php-5.3

我不知道为什么在使用这个正则表达式的输入中找到了2个匹配项,当我预期只有1个匹配时。

preg_match(/_(\d(-\d){0,3})\./,$str,$matches);

使用此文件字符串格式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

但这是我得到的结果:

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

如果A之前带有连字符,我只希望将D捕获到{{1}}。 这段代码是可用的,我可以简单地忽略第二场比赛,但我想知道为什么它在那里。我只能假设它与我的两个捕获组有关。我的错误在哪里?

3 个答案:

答案 0 :(得分:8)

是的,你得到两次捕获,因为正则表达式中有两个捕获组。

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

/_(\d(?:-\d){0,3})\./

答案 1 :(得分:1)

  

我只能假设它与我的两个捕获组有关。

你的假设是正确的

  

我的错误在哪里?

没有错误,一切都按预期行事。

答案 2 :(得分:0)

您必须在RE中进行分组,才能获得2场比赛。有什么令人惊讶的? 每对括号都是一组。