#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
Примечание. задача проверки номера телефона сложнее, чем показано в этих примерах кода