这是一个小例子,
我有多个正则表达式,即aa
,bb
和cc
,在过去,我只是循环遍历所有正则表达式,看看字符串是否可以匹配其中任何一个。如果任何正则表达式匹配,请停止该过程。
但现在我决定完全放弃,只需简单的OR操作,现在我得到了
(aa)|(bb)|(cc)
所以,如果我得到一个匹配,$1
就是我想要的,但我无法知道它是(aa)
还是(bb)
还是(cc)
做到了,有什么想法吗?
答案 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";
}
}