我在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
正如您所看到的,即使我正在使用/ i修饰符,MEX也可以正确匹配,因为这是它要搜索的术语,而不是Mex。我究竟做错了什么?
编辑:美国是匹配的,机器人不是美国。
供参考的正则表达式模式是 $string =~ s/\s$columns[$col][$ro],/ $head,/i
谢谢!
问题是我没有包括“ g”运算符,这意味着一旦找到“国家/地区名称”替代的一个实例,它就会停止寻找其他实例。
通过更改$string =~ s/\s$columns[$col][$ro],/ $head,/i
为$string =~ s/\s$columns[$col][$ro],/ $head,/ig
匹配是正确的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句