Как я могу захватить только одну часть регулярного выражения Perl с группировкой? - PullRequest
1 голос
/ 19 апреля 2010

Я сейчас пытаюсь извлечь даты из файла и передать их прямо в массив. Мое регулярное выражение работает, но у меня есть 6 групп, все из которых добавляются в массив, когда мне нужна только первая.

@dates = (@dates, ($line =~ /((0[1-9]|[12][0-9]|3[01])(\/|\-)(0[1-9]|1[0-2])(\/|\-)([0-9][0-9][0-9][0-9]|[0-9][0-9]))/g ));

Есть ли простой способ получить группу $ 1 для регулярного выражения Perl?

мой вывод выглядит так:

13/04/2009, 13, /, 04, /, 2009, 14-12-09, 14, -, 12, -, 09

Ответы [ 2 ]

4 голосов
/ 19 апреля 2010

Это регулярное выражение выглядит как то, что смущает меня, когда я в следующий раз беру код. Я бы разбил это:

    my $date= qr/
       (?:0[1-9]|[12][0-9]|3[01])           # day
       (?:\/|\-)
       (?:0[1-9]|1[0-2])                    # month
       (?:\/|\-)
       (?:[0-9][0-9][0-9][0-9]|[0-9][0-9])  #year
       /x ;

Вы можете добавить элемент в массив, используя

    push @dates,   ($line =~ /($date)/ ) ;

Вы упростите бит разделителя (обратите внимание, что я изменил на использование ( ) вместо / /, чтобы избежать необходимости использовать обратную косую черту /

    my $date= qr (
       (?: 0[1-9] | [12][0-9] | 3[01]       # day
       [/-]
       (?:0[1-9]|1[0-2])                    # month
       [/-]
       (?:\d{4}|\d{2})                      #year
       )x ;
1 голос
/ 19 апреля 2010

только что нашел. Вы можете создать пассивную группу, используя ?: в начале группы.

@dates = (@dates, ($line =~ /((?:0[1-9]|[12][0-9]|3[01])(?:\/|\-)(?:0[1-9]|1[0-2])(?:\/|\-)(?:[0-9][0-9][0-9][0-9]|[0-9][0-9]))/g ));

делая все остальные группы пассивными, теперь в массив добавляется только первая группа.

...