【发布时间】:2017-01-12 09:36:03
【问题描述】:
我在 perl 中的正则表达式模式正确匹配区分大小写的字符串,但不是大小写不同的字符串。我正在解析一个 CSV 文件,其中第一行是国家名称,其他行是该国家/地区的缩写或常见的其他拼写。
示例:CSV 的第 1 列是美国、美国、美国、美国。第 2 列是:墨西哥、MX、MEX。
这是完整的代码::
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper qw(Dumper);
my $filename = 'countrycodes.csv';
my $line;
my @rowStrings;
my @rows;
my @columns;
这是我用来测试代码的字符串:
my $string = "Mex, MEX, USA, usa, US, MX, CAN, Canada";
open(my $fh, '<', $filename) or die "Can't open $filename: $!";
$line = <$fh>;
@rowStrings = split("\r", $line);
#make rows strings into arrays
foreach my $i (0..$#rowStrings){
$rows[$i] = [split(",",$rowStrings[$i])];
}
my $columnCount = values scalar $rows[0];
print "column count: $columnCount \n";
#create array for each column from CSV
foreach my $column (0..$columnCount){
foreach my $row (0..$#rows){
$columns[$column][$row] = $rows[$row][$column];
if ($columns[$column][$row]) {
}
}
}
在这里,我正在浏览缩写/拼写数组并寻找匹配项。从数组中搜索任何缩写,并将它们替换为 CSV 文件 ($head) 中的标题/国家/地区名称。
for my $col (0..$#columns-1){
my $head = $columns[$col][0];
for my $ro (1..$#rows){
if ($columns[$col][$ro]){
$string =~ s/\s$columns[$col][$ro],/ $head,/i;
print $string . "\n";
}
}
}
这是作为最终结果的终端输出:
Mex, Mexico, United States, usa, United States, Mexico, Canada, Canada
如您所见,MEX 匹配正确,因为这是它正在搜索的术语,但不是 Mex,即使我使用了 /i 修饰符。我做错了什么?
编辑:美国匹配,机器人不是美国。
作为参考,正则表达式模式是$string =~ s/\s$columns[$col][$ro],/ $head,/i
谢谢!
【问题讨论】:
-
为什么不打印出
$columns[$col][$ro]看看它试图匹配什么。 -
我一开始是打印出来的。我知道它与 CSV 字段的确切拼写匹配,但在大小写不同时不匹配。
-
可能 Mex 不匹配,因为它前面没有空格,而您正在专门搜索那里的空格
\s。 -
美国呢?