Почему этот захват регулярного выражения дает 2 совпадения?

Я не знаю, почему найдено 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, если перед ним стоит дефис. Этот код можно использовать, и я могу просто игнорировать второе совпадение, но я хотел бы знать, почему оно там. Я могу только предположить, что это как-то связано с двумя моими группами захвата. Где моя ошибка?


person Kim    schedule 07.04.2012    source источник


Ответы (3)


Да, вы получаете два захвата, потому что у вас есть две группы захвата в регулярном выражении.

Чтобы избежать нежелательного захвата, вы можете использовать группу без захвата (?:...):

/_(\d(?:-\d){0,3})\./
person Mark Byers    schedule 07.04.2012

Я могу только предположить, что это как-то связано с двумя моими группами захвата.

Ваше предположение верно

Где моя ошибка?

Ошибки нет, все идет как положено.

person meagar    schedule 07.04.2012

Вы должны сгруппироваться в своем RE, поэтому вы получите 2 совпадения. Что удивительно? Каждая пара скобок является группой.

person MK.    schedule 07.04.2012
comment
Это помогает узнать, как сделать группу не пленной ;) - person Kim; 07.04.2012