使用perl正则表达式匹配2个模式的出现

时间:2013-11-24 15:36:12

标签: regex perl

假设我有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

5 个答案:

答案 0 :(得分:2)

试试这个:

^(([A-Za-z]{2}|\d\d),)*([A-Za-z]{2}|\d\d)$

Tested on regexe

得到以下结果:

Result

答案 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