2010-04-16 18 views
6

Tôi biết bạn có thể tạo tất cả các hoán vị từ danh sách, sử dụng ví dụ glob hoặc Algorithm::Permute - nhưng làm thế nào để bạn tạo tất cả các hoán vị có thể có từ một cụm từ thông dụng?Làm thế nào tôi có thể tạo tất cả các hoán vị có thể có từ một biểu thức chính quy Perl?

tôi muốn làm như:

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

Trả lời

2

Bất kỳ việc triển khai nào cũng có thể có độ dài tối đa hợp lý cho các chuỗi được tạo. Nếu có + hoặc * ở bất kỳ đâu trong khoảng thời gian đó, các khả năng có thể không có kết thúc. Regexp::Genex xem xét điều này.

+0

tiếc là in "perl -MRegexp :: Genex =: all -le 'cho chuỗi (" [a-z] ")'" không hoạt động. Tôi nghĩ rằng nó có lỗi với() và [] bộ. – wibble

0

Không có giải pháp nào tôi đã gặp phải trong giao diện điều khiển; Regexp :: Genex không, cũng không là giải pháp ở đây:

http://www.mail-archive.com/[email protected]/msg31051.html

Trong khi tôi đồng ý rằng HOP là một cuốn sách tuyệt vời, nó thực sự chỉ làm việc với một nhóm nhỏ các regexes "out-of-the- cái hộp".

Nếu ai biết của một xử lý lookaheads, rằng sẽ thật tuyệt:/

+0

Vấn đề ba lô (được biết là NP-complete) có thể được dịch một cách trivially để xác định liệu có tồn tại bất kỳ chuỗi nào được kết hợp bởi một regex được xây dựng (với lookaheads) hay không. Nói cách khác, nó quá khó. – ephemient

0

chỉ trong trường hợp có ai tìm thấy nó hữu ích:

 
*$ 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($_); 
} 

sau đó bạn có thể làm:

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

tất cả hoán vị của một byte theo bit hoặc

 
*perl bitfizz.pl "ABCDEF" 2* 

ví dụ: