逐个匹配多个正则表达式

时间:2013-07-08 12:22:34

标签: regex perl

我有多个正则表达式。我想先将字符串与regex1匹配,如果不匹配,则匹配regex2。在每次匹配时,我想用值更新公共哈希。

$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 个答案:

答案 0 :(得分: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" );
}