我知道您可以使用glob或Algorithm::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;
}
答案 0 :(得分:6)
请参阅Section 6.5 (PDF)中的Higher Order Perl。考虑购买印刷书:这是一件艺术品。
答案 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*
例如