我知道你可以使用glob或Algorithm::Permute來生成列表中的所有排列,但是如何從正則表達式生成所有可能的排列?如何從Perl正則表達式中生成所有可能的排列?
我想做的事情,如:
@perms = permute("/\s[A-Z][0-9][0-9]/");
sub permute($regex) {
# code - put all permutations of above regex in a list
return @list;
}
我知道你可以使用glob或Algorithm::Permute來生成列表中的所有排列,但是如何從正則表達式生成所有可能的排列?如何從Perl正則表達式中生成所有可能的排列?
我想做的事情,如:
@perms = permute("/\s[A-Z][0-9][0-9]/");
sub permute($regex) {
# code - put all permutations of above regex in a list
return @list;
}
見Section 6.5 (PDF)在Higher Order Perl。考慮購買印刷書籍:這是一件藝術品。
對於生成的字符串,任何可能的實現都應該有一個合理的最大長度。 如果在該正則表達式的任何地方有+
或*
,可能性可能沒有結束。 Regexp::Genex認爲此。
我遇到過的任何解決方案都不能處理lookahead;正則表達式:: GENEX沒有,也沒有在這裏做的解決方案:
http://www.mail-archive.com/[email protected]/msg31051.html
雖然我同意HOP是一個真棒書,它真的只用正則表達式的一小部分交易「外的the-框」。
如果有人一個處理向前看符號的人都知道,那簡直太好了:/
揹包問題(已知爲NP-完全)可以平凡地轉化爲確定是否存在任何由構造的正則表達式匹配的字符串(帶有向前看)。換句話說,這太難了。 – ephemient 2010-10-22 03:21:23
以防萬一有人發現它有用:
*$ 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 "ABCDEF" 2*
例如
不幸的是「perl -MRegexp :: Genex =:all -le'字符串打印(」[a-z]「)'」雖然不起作用。我認爲它有()和[]集的錯誤。 – wibble 2010-10-22 12:30:43