2013-07-08 77 views
0

我有多個正則表達式。我想首先匹配一個字符串與regex1,如果它不匹配,然後匹配正則表達式2。在每場比賽中,我想用值更新一個常見的散列。匹配多個正則表達式一個接一個

$str = "%v:%{local}p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" %D"; 
@regex = (/\%\{[\-\w]+\}\w/g , /\%\w+/g); 

我想匹配str上的每個正則表達式並更新散列。有人可以幫助我如何做到這一點。

回答

1

不知道你常見的散列是什麼 - 或者你想捕獲什麼樣的正則表達式的部分是,我所能建議的就是如何一次測試一個正則表達式,直到你找到一個匹配。將它們放入一個循環中,然後在找到匹配項後使用last關鍵字來中止循環。


$str = "%v:%{local}p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" %D"; 
@regexes = (qr/\%\{[\-\w]+\}\w/g , qr/\%\w+/g); 

foreach my $regex (@regexes) { 
    if ($str =~ $regex) { 
     # update hash here 
     ... 
     last; # exit loop 
    } 
} 

用槍指着我的頭,如果我猜你想捕捉我建議的如下內容:


$str = "%v:%{local}p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" %D"; 
@regexes = (qr/\%\{([\-\w]+)\}\w/g , qr/\%(\w+)/g); 

my %words =(); 

foreach my $regex (@regexes) { 
    if ($str =~ $regex) { 
     # update hash here 
     my $word = $1; 
     $words{$word}++; 
     last; # exit loop 
    } 
} 

# print out words found 
foreach my $word (sort keys %words) { 
    print("$word\n"); 
} 
+0

四處錯誤:裸詞發現,其中運營商預計將在t.pl線3條,近「qr/\%\ {[\ - \ w] + \} \ w/g」 – pradeepchhetri

+1

qr(...)不需要/ g。 – Dallaylaen

+1

是的,你必須寫:'$ str =〜/ $ regex/g' – shawnhcorey

相關問題