Perl сопоставьте и извлеките номер телефона в формате (312) 555-1212

#regex #perl

Вопрос:

Попытка заставить perl распознавать и извлекать номер телефона в строке с некоторым странным форматированием, найденным в файле:

 my $str = 'Phone:  (312) 555-1212 _ ';  

Я пробовал, но это решение, но оно заканчивается извлечением всех чисел из строк:

 my @all_nums = $element =~ /(d )/g;     if (@all_nums) {    my $ph = join('-', @all_nums);  print "PHONE NO: $phn";     push(@elements_found, $ph);   }  

Мы будем очень признательны за любую помощь.

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

1. Возможно, вместо переменной вам следует показать текстовый файл в качестве тестового примера.

2. Пожалуйста, отредактируйте вопрос, чтобы показать результат, который вы получаете, и результат, который вы ожидаете.

3. Вы хотите извлечь строку "(312) 555-1212" или три значения "312" , "555" и "1212" , или что-то еще?

Ответ №1:

Попробуйте более точное регулярное выражение для числового формата:

 my @all_nums = $element =~ /((d )) (d )-(d )/g;     if (@all_nums) {    my $ph = join('-', $1, $2, $3);  print "PHONE NO: $phn";     push(@elements_found, $ph);   }  

Ответ №2:

Следующий фрагмент демонстрационного кода считывает блок данных строка за строкой и извлекает телефон, если таковой существует в строке, в противном случае переходит к чтению следующей строки. Если в строке был найден номер телефона, то он выводится на экран.

 use strict; use warnings; use feature 'say';  my $re = qr/((d{3}) d{3}-d{4})/;  while( lt;DATAgt; ) {  next unless /$re/;  say "-- $1 --"; }  __DATA__ Phone:  (312) 555-1212 _  Call customer service at (328) 371-9302 for an assistance  

Выход

 -- (312) 555-1212 -- -- (328) 371-9302 --  

Следующий пример кода считывает блок данных в переменную $data , а затем с помощью регулярного выражения извлекает все телефонные номера в массив @phones , а затем выводит их на экран.

 use strict; use warnings; use feature 'say';  my $re = qr/((d{3}) d{3}-d{4})/;  my $data = do { local $/; lt;DATAgt;; }; my @phones = $data =~ /$re/g;  say for @phones;  __DATA__ Phone:  (312) 555-1212 _  Call customer service at (328) 371-9302 for an assistance  

Выход

 (312) 555-1212 (328) 371-9302  

Примечание. задача проверки номера телефона сложнее, чем показано в этих примерах кода