2016-09-05 36 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

相關問題