2014-08-29 53 views
1

好吧,我嘗試了一些選項,但我沒有得到它的權利 - 看起來像它與我的正則表達式規範的問題,但它也可能是其他語法。任何幫助/方向都非常感謝。從Perl中的字符串中提取並分配匹配的正則表達式模式到一個變量

我想讀取一個CSV文件並一次處理一行 - 放棄標題行。我將特別關注該文件中的兩個字段。

現在,經過我讀文件的一行的時間,我想處理這兩個領域爲這樣:

while (my $line = <$data>) { 
    chomp $line; 
    if ($line !~ /^Date/) { 
     if ($line =~ /"/) { $line =~ s|"||g } 

     ...; 

     my $homeTeam = getTeam($fields[5]); 
     my $awayTeam = getTeam($fields[7]); 

     ...; 

     my $arbiterRec = join ",", $gameDate, $gameTime, "", $season, $gameLevel, 
      $homeTeam, "", $awayTeam, "", $site, $subSite, "", ""; 
     print "$arbiterRec\n"; 
    } 
} 

sub getTeam { 
    my ($team) = trim($_[0]) =~ m{(R\d+-\d+B|G\d+$)}x; 
    return $team; 
} 

sub trim { 
    (my $s = $_[0]) =~ s/^\s+|\s+$//g; 
    return $s; 
} 

有了這個,如果我有這樣的標記有興趣(字段輸入^ ^^):

mm/dd/yyyy, hh:mm AA, dd, Aaaaaa, aaD, R35-14G1, , U14 Girls Area Schedule R256-14G1, , AAA, , , 
             ^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

我希望能得到這樣的輸出:

mm/dd/yy, hh:mm AA, dd, Aaaaaa, aaD, R35-14G1, , R256-14G1, , AAA, , , 
            ^^^^^^^^ ^^^^^^^^^ 

在代替我所得到的是:

mm/dd/yy, hh:mm AA, dd, Aaaaaa, aaD, G1, , G1, , AAA, , , 
            ^^ ^^ 

任何想法我可能在語法或RegEx匹配中做錯了什麼?

回答

1

只要改變你的正則表達式,

(R\d+-\d+(?:B|G)\d+$) 

有什麼實際的問題是對的話(R\d+-\d+B|G\d+$)正則表達式首先檢查與R隨後再次跟着一個或多個數字開始 - 終於在最後B。但是在你的輸入中沒有這樣的詞。所以這會失敗。接下來進入第二部分,以G開頭,最後匹配最後的G和下面的一個或多個數字。

+0

謝謝Avinash解釋問題+1 – user1931485 2014-08-29 22:50:16