2016-09-05 35 views
-1

在Perl中我的正则表达式模式正确匹配区分大小写的字符串,但不是大小写不同的字符串。我正在解析一个CSV文件,其中第一行是国家名称,其他行是该国家的缩写或常见其他拼写。不区分大小写的正则表达式匹配不在perl中工作

示例: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正确匹配,因为这是它正在搜索术语,而不是墨西哥,即使我正在使用/ i修饰符。我究竟做错了什么?

编辑:美国是匹配的,bot不是美国。

,以供参考正则表达式是$string =~ s/\s$columns[$col][$ro],/ $head,/i

谢谢!

+0

为什么不打印'$ columns [$ col] [$ ro]'来查看它试图匹配的东西。 – xxfelixxx

+0

我一开始就把它打印出来。我知道它与CSV字段的确切拼写相匹配,但在案件不同时不适用。 – chuckieDub

+0

'使用Text :: CSV;' – Robert

回答

0

的问题是,我并没有包括“G”运营商,这意味着一旦它找到了国名替代的一个实例,它停止了寻找其他的。

通过将$string =~ s/\s$columns[$col][$ro],/ $head,/i更改为$string =~ s/\s$columns[$col][$ro],/ $head,/ig该匹配是正确的。

0

我不完全理解你在做什么,但也许这有助于:你的正则表达式中的\ s尝试匹配空白,但不匹配缺少空白。由于您的“Mex”位于该行的开头,因此它前面没有空格。作为一个实验,尝试将“Mex”移动到该行中的不同位置。

+0

我明白你的观点。美国/美国呢? – chuckieDub

0

这似乎是解析CSV不是你的问题。 (我仍然推荐Text::CSV。)

假设你在数组中有你的语言和选择,并且你有这些语言的数组,你可以比较输入。你或许应该除去开头或结尾的空白,并且比较不区分大小写的,但你并不需要一个正则表达式:

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

my @countries = ( 
    ['United States of America', 'US', 'USA', 'US of A', 'United States'], 
    ['Mexico', 'MX', 'Mex'], 
); 

my @input = ('US ', ' mx ', ' Mexico', ' us of a'); 

foreach my $input (@input) { 
    $input =~ s/^\s+//; 
    $input =~ s/\s+$//; 
    my $found = 0; 
    foreach my $country (@countries) { 
     foreach my $alternative (@$country) { 
      if (lc($input) eq lc($alternative)) { 
       print "$input is ${$country}[0]\n"; 
       $found = 1; 
      } 
     } 
    } 
    print "did not find $input\n" unless($found); 
} 
+0

我无法剥离替代品的所有内容,因为此CSV还包含可能包含这些字符的人物名称。 – chuckieDub

+0

lc是可以的,但是会忽略Mex和Usa吗? – chuckieDub

相关问题