合并多个正则表达式,我怎么知道哪个部分匹配了?

时间:2013-01-31 07:25:51

标签: perl

这是一个小例子,

我有多个正则表达式,即aabbcc,在过去,我只是循环遍历所有正则表达式,看看字符串是否可以匹配其中任何一个。如果任何正则表达式匹配,请停止该过程。

但现在我决定完全放弃,只需简单的OR操作,现在我得到了

(aa)|(bb)|(cc)

所以,如果我得到一个匹配,$1就是我想要的,但我无法知道它是(aa)还是(bb)还是(cc)做到了,有什么想法吗?

1 个答案:

答案 0 :(得分:3)

在您的示例中,如果匹配,则会设置$1;如果bb匹配,$1将为undef,并且$2将被设置,等等。

if ( defined $1 ) {
    print "first part matched: $1.\n";
}
elsif ( defined $2 ) {
    print "second part matched: $2.\n";
}
...

或更动态地使用@-@+

my $string = "xbb";
if ( $string =~ /(aa)|(bb)|(cc)/ ) {
    my $match = ( grep defined $-[$_], 1..$#- )[0];
    if ( defined $match ) {
        print "part $match matched: " . substr( $string, $-[$match], $+[$match]-$-[$match] ) . ".\n";
    }
}