假设我有2个正则表达式模式[\d\d]
和[a-zA-Z][a-zA-Z]
,我想检查一个字符串是否包含任何数字和任何顺序的模式,只有那些用逗号分隔的模式我怎么能这样做用perl?
例如字符串ex,xy,gf,55,66-> match
例如字符串22,24,25,56,ff ->match
例如字符串2FF,24,25,56,ff -> not match
答案 0 :(得分:2)
答案 1 :(得分:1)
#!/usr/bin/perl
use warnings;
use strict;
my $pattern1 = '\d';
my $pattern2 = '[a-zA-Z]';
my $string = ('ex,xy,gf,55,66');
my $warning = 0;
my @split = split(/,/, $string);
foreach (@split){
unless (($_ =~ /^$pattern1{2}$/) or ($_ =~ /^$pattern2{2}$/)) {
$warning++;
}
}
print "$string -> match\n" if ($warning == 0);
print "$string -> no match" if ($warning != 0);
输出:
ex,xy,gf,55,66 -> match
相同的代码,不同的字符串:
my $string = ('22,2f,ex,xy,gf,2FF');
输出:
22,2f,ex,xy,gf,2FF -> no match
答案 2 :(得分:0)
以下是使用/^(?:[a-z]{2},?|\d\d,?)+$/i
的选项:
use strict;
use warnings;
while (<DATA>) {
chomp;
my @elems = split /,/;
my @match = grep /^(?:\d{2}|[a-z]{2})$/i, @elems;
print "$_ -> ", ( @elems == @match ? '' : 'not ' ), "match\n"
}
__DATA__
ex,xy,gf,55,66
22,24,25,56,ff
2FF,24,25,56,ff
输出:
ex,xy,gf,55,66 -> match
22,24,25,56,ff -> match
2FF,24,25,56,ff -> not match
希望这有帮助!
答案 3 :(得分:0)
您可以使用:
^((?>[a-z]{2}|[0-9]{2})(?>,(?1)|$))
或者这个:
^(?>(?>[a-z]{2}|[0-9]{2})(?>,|$))+$
答案 4 :(得分:0)
在Perl中玩这个之后,我想出了这个
我测试了Perl中发布的所有答案。问题来自于试图匹配
非常大的字符串。主要是&gt; 256 K. Perl似乎找不到匹配,其中在
它的尺寸较小,确实如此。也许它是我不使用的设置,我不知道..
唯一的例外是卡西米尔的递归正则表达式,这需要一分钟来匹配一个3兆的缓冲区。
因此,对于咧嘴笑,我把一个与所允许的负面相匹配的正则表达式组合在一起 15 meg缓冲区在我的机器上最多需要10秒钟,具体取决于故障(匹配)的位置 如果通过,则为10秒。值得注意的是,没有积累 捕获信息,也许这就是为什么它可以处理大缓冲区。
$test = "ex,xy,gt,55,66,";
for (0 .. 19 ) { $test .= $test; }
$test .= "3a3";
print "\nlength = ", length($test), "\n------------\n";
if ( $test =~ m/
# \d(?:[a-z]|\d{2})|[a-z](?:\d|[a-z]{2})|[^a-z\d,]|,(?:.?,|$)|^,
\d
(?: [a-z] | \d{2} )
|
[a-z]
(?: \d | [a-z]{2} )
|
[^a-z\d,]
|
,
(?: .? , | $ )
|
^ ,
/xg )
{ print "Found error at pos = ", pos($test), "\n"; }
else
{ print "Passed test!\n"; }
__END__
Output >>
length = 15728643
------------
Found error at pos = 15728642