2013-07-08 49 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

相关问题