Как я могу генерировать все возможные перестановки из регулярного выражения Perl? - PullRequest
6 голосов
/ 16 апреля 2010

Я знаю, что вы можете генерировать все перестановки из списка, используя, например, 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;
}

Ответы [ 4 ]

6 голосов
/ 16 апреля 2010

См. Раздел 6.5 (PDF) в Perl высшего порядка . Подумайте о покупке печатной книги: это произведение искусства.

Существует также Regexp :: Genex на CPAN .

2 голосов
/ 17 апреля 2010

Любая возможная реализация должна иметь разумную максимальную длину для сгенерированных строк. Если в этом регулярном выражении есть + или *, возможности могут быть без конца. Regexp :: Genex считает это.

0 голосов
/ 27 января 2011

на всякий случай, если кому-нибудь это пригодится

*$ 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&lt=$_[1]; $i+=1 ) { $_=$_."{$_[0]}"; } 
    @r=glob( $_ );
}

тогда вы можете сделать:

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

все перестановки байта в битах или

*perl bitfizz.pl "0123456789ABCDEF" 2*

например

0 голосов
/ 22 октября 2010

Ни одно из решений, с которыми я сталкивался, не решает проблемы с поиском; Regexp :: Genex не имеет, и не имеет решения здесь:

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

Хотя я согласен с тем, что HOP - это потрясающая книга, на самом деле речь идет только о небольшом подмножестве регулярных выражений "из коробки".

Если кто-нибудь знает о том, кто обрабатывает lookaheads, это было бы здорово: /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...