1

これは最小限のケースです。

私は複数の正規表現、つまりaabb、およびを持っていますcc。昔は、すべての正規表現をループして、文字列がそれらのいずれかに一致するかどうかを確認していました。いずれかの正規表現が一致した場合は、プロセスを停止します。

しかし今、私は単純な OR 操作でそれをまとめることを決めました。

(aa)|(bb)|(cc)

一致した場合、$1それは私が望んでいたものですが、それがそれであったか、またはそれであったかを知ることはできません(aa)(bb)何か(cc)アイデアはありますか?

4

1 に答える 1

3

あなたの例では、aaが一致した場合、$1が設定されます。bbが一致した場合、$1undefになり$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";
    }
}
于 2013-01-31T07:50:14.947 に答える