Perl regex выводит дефисы с несколькими «словами»

#regex #perl

#регулярное выражение #perl

Вопрос:

Когда у меня есть строка с несколькими дефисами в ней, я, кажется, могу найти (единственное) желаемое значение, но почему существует несколько выходов? Я бы хотел просто сообщить о совпадающей строке полностью, с дефисами. Я включил то, что, вероятно, является результатом, а также способ перестроить строку, но этот метод кажется ненужной работой.

 my $string = "phonenumber123-456-7890";
my @secondStrings = $string =~ m/(d )-(d )-(d )/g;
foreach (@secondStrings){
    print $_, "n";
}
if ($string =~ m/(d )-(d )-(d )/g){
    print $1."-".$2."-".$3, "n";
}
  

Комментарии:

1. Почему вы не помещаете все в одну группу захвата?

2. Почему отрицательные голоса по этому вопросу. Проблема может быть очевидной, но для тех, у кого нет опыта использования Perl / регулярных выражений, в частности групп захвата, этого не произойдет. Если это из-за формулировки вопроса, это может непреднамеренно быть прямым результатом этого непонимания.

Ответ №1:

Я полагаю, вы просто хотите поместить весь номер телефона (123-456-7890) в 1 группу захвата, прямо сейчас вы используете 3.

 my ($number) = $string =~ m/(d -d -d )/g;
  

Дальнейшее чтение можно найти здесь: http://perldoc.perl.org/perlre.html#Capture-groups

Комментарии:

1. Я полагаю, вы имели my ($number) = $string =~ m/(d -d -d )/g; в виду, что в противном случае $number в скалярном контексте будет присвоено количество захваченных элементов.

2. Спасибо за этот ответ. Это решается для всех практических целей, но если есть только одно совпадение, зачем мне вообще нужна группа захвата?