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