可以将角色与几种条件相匹配吗?

时间:2015-02-13 11:06:30

标签: regex perl

我的脚本是

foreach (<DATA>){
if( m/a[br\w][cq][ez][fx]g[hy]/g)
{
print "$&\n";
}
elsif( m/a[br][cq\w][ez][fx]g[hy]/g) 
{
print "$&\n";
}
elsif( m/a[br][cq][ez\w][fx]g[hy]/g){
print "$&\n";
}
elsif( m/a[br][cq][ez][fx\w]g[hy]/g){
print "$&\n";
}
elsif( m/a[br][cq][ez][fx]g[hy\w]/g){
print "$&\n";
}
}

__DATA__
abcefgh 
abqzxgh
arcefgy
abqzxgM
arMzfgy
arVRfgy
arVARgy
abcefgh
arcexgy

我的脚本给出了我期望的脚本输出

abcefgh
abqzxgh
arcefgy
abqzxgM
arMzfgy
abcefgh
arcexgy

任何可能的if-else条件脚本都会短路到单个正则表达式行。

1 个答案:

答案 0 :(得分:4)

您可以使用|更改来匹配多个模式。 /(?| (first)|(second) )/x,将任何匹配的群组放入$1

use strict;
use warnings;

my $re = qr{
  (?|
    (a[br\w][cq][ez][fx]g[hy]) |
    (a[br][cq\w][ez][fx]g[hy]) |
    (a[br][cq][ez\w][fx]g[hy]) |
    (a[br][cq][ez][fx\w]g[hy]) |
    (a[br][cq][ez][fx]g[hy\w])
  )
}x;



while (<DATA>) {

  if (/$re/) {  print "$1\n"; }  
}
__DATA__
abcefgh 
abqzxgh
arcefgy
abqzxgM
arMzfgy
arVRfgy
arVARgy
abcefgh
arcexgy

输出

abcefgh
abqzxgh
arcefgy
abqzxgM
arMzfgy
abcefgh
arcexgy