1

这是一个最小的案例,

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

但现在我决定把它完全说出来,用一个简单的 OR 操作,现在我得到了

(aa)|(bb)|(cc)

因此,如果我得到一个匹配,那$1将是我想要的,但我无法知道它是(aa)或它(bb)是否(cc)做到了,有什么想法吗?

4

1 回答 1

3

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

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

或者,更动态地,使用@-and @+

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";
    }
}
于 2013-01-31T07:50:14.947 回答