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

Regex 如何从Perl正则表达式生成所有可能的排列?,regex,perl,permutation,Regex,Perl,Permutation,我知道你可以从一个列表中生成所有的排列,例如使用或-但是你如何从正则表达式生成所有可能的排列呢 我想这样做: @perms = permute( "/\s[A-Z][0-9][0-9]/" ); sub permute( $regex ) { # code - put all permutations of above regex in a list return @list; } 再见。考虑购买印刷书籍:它是一件艺术品。 还有一个问题。任何可能的实现都应该为生成的字符串考虑一

我知道你可以从一个列表中生成所有的排列,例如使用或-但是你如何从正则表达式生成所有可能的排列呢

我想这样做:

@perms = permute( "/\s[A-Z][0-9][0-9]/" );
sub permute( $regex ) {
    # code - put all permutations of above regex in a list
    return @list;
}
再见。考虑购买印刷书籍:它是一件艺术品。
还有一个问题。

任何可能的实现都应该为生成的字符串考虑一个合理的最大长度。 如果在这个regexp中的任何地方都有一个
+
*
,那么这种可能性是无限的。
考虑到这一点。

我所遇到的解决方案中,没有一个能处理lookaheads;Regexp::Genex没有,这里的解决方案也没有:

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


如果有人知道一个可以处理lookaheads的,那就太好了:/

以防有人发现它有用:

*$ 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( $_ ); } *$cat bitfizz.pl* #!/usr/bin/perl 严格使用; 如果($#ARGV+1)!=2){打印“用法$0\n”;} my@r=&bitfizz($ARGV[0],$ARGV[1]); 对于(@r){print“$\n”;} 子比特嘶嘶(){ $\[0]=连接(“,”,拆分(/,$\[0]); 对于(my$i=1;$i<=$\u[1];$i+=1){$\u=$\ u0]};} @r=全球(美元); } 然后你可以做:

*perl bitfizz.pl "01" 8* 00000000 00000001 00000010 00000011 00000100 --snip-- *perl bitfizz.pl“01”8* 00000000 00000001 00000010 00000011 00000100 --剪断-- 以位为单位的字节的所有排列 或

*perl bitfizz.pl“0123456789ABCDEF”2* 例如

背包问题(已知为NP完全)可以简单地转化为确定是否存在与构造的正则表达式(带lookaheads)匹配的字符串。换句话说,这太难了。不幸的是,“perl-MRegexp::Genex=:all-le'print for strings(“[a-z]”)无法工作。我认为它有()和[]集的bug。 *perl bitfizz.pl "0123456789ABCDEF" 2*