2013-02-20 39 views
0

我有一個看起來像這樣的列表:正則表達式沒有找到匹配

__DATA__ 
49103393193[0-9]{1,3};+49103/393193-0;Company 1;Street;Number;Postal Code;City 

現在我在加載的大名單使用這些值的哈希看起來像這樣:

%voicePrefix = (
    '49103393193[0-9]{1,3}' => [ 
           '+49103/393193-0', 
           'Company 1', 
           'Street' 
           'Number' 
           'Postal Code' 
           'City' 
          ], 
); 

my %voicePrefix = map { 
    chomp; 
    my @fields = split ';'; 
    shift @fields => \@fields; 
} __DATA__; 
my $voiceRegex = '(' . join('|',map{quotemeta} keys %voicePrefix) . ')'; 

現在的問題是我有另一個列表,並附有批號的所以可以說我在給@line加載的文件:

我做這個做S的看起來是這樣的:

[email protected]__ 
4910339319344;Test 1 
49103393193411;Test 2 
49103393193941;Test 3 

現在我想要做的就是使用正則表達式對我做這樣的數量,而是doesent工作,它永遠不會找到一個匹配

my @lines = __FILEUPTHERE__; 
my @line; 

my $company; 

for(my $i = 0; i < @lines; $i++) 
{ 
    #Split Line 
    @line = split(/,/, $lines[$i]); 

    #NO MATCH HERE 
    $company = $voicePrefix{$1}[1] if ($line[0] =~ /$voiceRegex/); 
} 

希望有人可以幫助我解決這個問題。

謝謝:)

回答

2

構建正則表達式,這意味着所有的散列鍵都將在正則表達式字面上處理時,您正在使用quotemeta。您正在尋找字符串49103393193[0-9]{1,3},而不是後面跟1-3個數字。

刪除map{quotemeta},你應該沒問題。

注意:如果輸入不是來自可信來源,則從輸入中獲取正則表達式是一個安全漏洞。

更新:另外,Perl幾乎不需要C風格的for循環。他們應該避免。相反:

foreach my $line (@lines) 
{ 
    #Declare a variable here if you are using it here. 
    my @fields = split(/,/, $line); 

    $company = $voicePrefix{$1}[1] if ($fields[0] =~ /$voiceRegex/); 
} 

更新2:您可能還需要錨添加到您的正則表達式,以確保您匹配的相同字符串,而不是一個較長的字符串的一個子集:/^$voiceRegex$/

更新3:通過這些更正,匹配成功。但是,您還有一個問題,那就是您試圖使用匹配的號碼作爲voicePrefix的關鍵字。然而,這是行不通的,因爲voicePrefix的鍵是正則表達式,而不是可能匹配這些正則表達式的數字。需要改變您的設計。最簡單的方法是不創造一個大的正則表達式,但只是測試每個關鍵看是否匹配。

foreach my $line (@lines) 
{ 
    #Declare a variable here if you are using it here. 
    my @fields = split(/;/, $line); 

    foreach my $regex (keys %voicePrefix) 
    { 
     $company = $voicePrefix{$regex}[1] if ($fields[0] =~ /$regex/); 
    } 
} 
+0

我與我的$ voiceRegex =「(」加入(沒有現在「|」,鑰匙%voicePrefix )'')';但它仍然匹配 – alexj 2013-02-20 11:16:23

+0

@alexj,您的代碼還存在另一個問題。查看我的答案更新。 – 2013-02-20 11:33:17

+0

謝謝它的工作原理,但不可能在一個正則表達式中完成它,因爲你的最後一個解決方案使我的代碼變慢,我的6x代碼花了20秒和一個正則表達式,並且需要120秒? – alexj 2013-02-20 11:56:58