Perl regex不会在一条线上获取多个北美电话号码

时间:2011-03-05 22:05:21

标签: regex perl

我正在尝试从CSV文件中获取所有NA电话号码。数字可以出现在每行的任何位置,每行也可以有多个数字(用逗号分隔)。我提出的正则表达式确实有效,至少它抓住了该行中的第一个电话号码。但尽管使用“/ 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 个答案:

答案 0 :(得分:1)

$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";
}

或者您可以尝试这样的事情:

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