Perl 合并多个正则表达式,如何知道哪个部分匹配?

Perl 合并多个正则表达式,如何知道哪个部分匹配?,perl,Perl,这是一个很小的例子 我有多个正则表达式,即aa、bb和cc,在过去,我只是循环遍历所有正则表达式,看看字符串是否可以匹配其中任何一个。如果任何正则表达式匹配,请停止该过程 但现在我决定把它放在一起,用一个简单的OR操作,现在我得到了 (aa)|(bb)|(cc) 因此,如果我找到匹配项,$1将是我想要的,但我无法知道是(aa)还是(bb)还是(cc),有什么想法吗?在您的示例中,如果aa匹配,将设置$1;如果bb匹配,$1将被取消定义,$2将被设置,以此类推 if ( defined $1 )

这是一个很小的例子

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

但现在我决定把它放在一起,用一个简单的OR操作,现在我得到了

(aa)|(bb)|(cc)


因此,如果我找到匹配项,
$1
将是我想要的,但我无法知道是
(aa)
还是
(bb)
还是
(cc)
,有什么想法吗?

在您的示例中,如果aa匹配,将设置
$1
;如果bb匹配,
$1
将被取消定义,
$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";
    }
}

啊,我明白了,你认为我可以直接得到第一个定义的$X,而不需要从$1开始循环$N?不,我不想要
(aa | bb | cc)
-P