Perl regex не захватывает несколько телефонных номеров в Северной Америке в строке - PullRequest
0 голосов
/ 06 марта 2011

Я пытаюсь получить все номера телефонов NA из файла CSV.Числа могут появляться где угодно в каждой строке, и каждая строка также может иметь несколько чисел (разделенных запятыми).Приведенное мной регулярное выражение работает, по крайней мере, захватывает первый номер телефона в строке.Но, несмотря на использование флага "/ g", он не будет захватывать другие телефонные номера.Кто-нибудь может подсказать, что может быть не так с моим кодом?

#!/usr/bin/perl
use warnings;
use diagnostics;
use strict;

my $data_file = "test.csv";

open my $FH, "<", $data_file || die "cannot open file\n";

my @lines = <$FH>;


while (@lines) {
if ((shift @lines) =~ /((\(\d{3}\)\s+|\d{3}-?|\d{3}\.?)(\d{3}-?|\d{3}\.?)\d{4})/g) {
    print "$1\n";
} else {
    print "No match\n";
}
}

1 Ответ

1 голос
/ 06 марта 2011

$1 является скаляром и поэтому не может содержать несколько совпадений.Вы можете попробовать что-то вроде этого:

my @matches = ((shift @lines) =~ /((?:\(\d{3}\)\s+|\d{3}-?|\d{3}\.?)(?:\d{3}-?|\d{3}\.?)\d{4})/g);
if (@matches) {
    print join("\n", @matches)."\n";
} else {
    print "No match\n";
}

Или вы можете попробовать что-то вроде этого:

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