0

我有多个正则表达式。我想先将一个字符串与 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 上的每个正则表达式并更新哈希。我怎样才能做到这一点?

4

1 回答 1

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" );
}
于 2013-07-08T12:24:29.843 回答