Regex 是否可以将字符与多个条件匹配?

Regex 是否可以将字符与多个条件匹配?,regex,perl,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 "$

我的剧本是

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

所有可能的if-else条件脚本都短接到单个正则表达式行。

您可以使用
|
更改来匹配多个模式。
/(?|(第一)|(第二))/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

您可以使用
|
更改来匹配多个模式。
/(?|(第一)|(第二))/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

@cyxon27没有给出结果。但这是一个很好的主意谢谢你。你能解释一下qr和x的用法吗?@Khaja
/x
忽略正则表达式中的空格,并检查是否有剩余的更新。@cyxon27不给出结果。但这是一个很好的主意谢谢你。你能解释一下qr和x的用法吗?@Khaja
/x
忽略正则表达式中的空格,并检查是否有剩余的更新。不明白为什么会出现这样的情况,比如
[br\w]
[cq\w]
[ez\w]
。。。同于
\w
包括
[A-Za-z0-9.]
。可能可以(删除空格或与x-flag一起使用)。不了解原因,例如
[br\w]
[cq\w]
[ez\w]
。。。同于
\w
包括
[A-Za-z0-9.]
。可能可以(删除空格或与x标志一起使用)。
abcefgh
abqzxgh
arcefgy
abqzxgM
arMzfgy
abcefgh
arcexgy