我正在尝试从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";
}
}
答案 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";
}