如何从Perl正则表达式生成所有可能的排列?

时间:2010-04-16 17:22:36

标签: regex perl permutation

我知道您可以使用globAlgorithm::Permute从列表中生成所有排列 - 但是如何从正则表达式生成所有可能的排列?

我想这样做:

@perms = permute( "/\s[A-Z][0-9][0-9]/" );
sub permute( $regex ) {
    # code - put all permutations of above regex in a list
    return @list;
}

4 个答案:

答案 0 :(得分:6)

请参阅Section 6.5 (PDF)中的Higher Order Perl。考虑购买印刷书:这是一件艺术品。

Regexp::Genex上还有CPAN

答案 1 :(得分:2)

任何可能的实现都应该为生成的字符串设置合理的最大长度。 如果该正则表达式中的任何位置都有+*,那么可能性无可奈何。 Regexp::Genex考虑​​到这一点。

答案 2 :(得分:0)

我遇到过的解决方案都没有处理前瞻; Regexp :: Genex没有,解决方案也没有:

http://www.mail-archive.com/spamassassin-talk@lists.sourceforge.net/msg31051.html

虽然我同意HOP是一本很棒的书,但它实际上只处理了一小部分正则表达式“开箱即用”。

如果有人知道处理前瞻的人,那就太好了:/

答案 3 :(得分:0)

万一有人发现它有用:

*$ cat bitfizz.pl*
#!/usr/bin/perl 
use strict;
if ( ($#ARGV+1)!=2 ) { print "usage $0  \n"; }
my @r = &bitfizz( $ARGV[0], $ARGV[1] );
for(@r){ print "$_\n"; }
sub bitfizz() {
    $_[0]=join( ",", split(//, $_[0] ) );
    for( my $i=1; $i<=$_[1]; $i+=1 ) { $_=$_."{$_[0]}"; } 
    @r=glob( $_ );
}

然后你可以这样做:

*perl bitfizz.pl "01" 8*
00000000
00000001
00000010
00000011
00000100
--snip--

以位为单位的所有字节排列 或

*perl bitfizz.pl "0123456789ABCDEF" 2*

例如