2014-10-28 71 views
2

我想使用正則表達式模式不知道現有的字符串是否匹配該模式,而是生成匹配該模式的所有可能的值。例如,對於模式\ d \ d \ d,它應該生成包括「000」「001」「002」等最多爲「999」的文字。這些可以以任何格式,數組或逗號分隔列表形式提供。如何在Perl中完成這項工作?這是一個內置功能還是將需要一個模塊?在Perl中使用正則表達式模式生成語法?

它不需要處理所有可能的模式,只需要爲數字或字母的模式生成語言就足夠了。

+1

祝你好運'.' – 2014-10-28 17:11:13

+0

什麼順序應該無限系列如'\ d + \ w +'被迭代? – dwarring 2014-10-28 17:23:49

+0

我使用的模式將是有限的,就像提供的示例一樣 - 只是任意三位數字。 – Joey 2014-10-28 17:24:30

回答

2

對於非常簡單的情況下,像你的評論,短短三提到的數字,這只是一個小的遞歸,喜歡這裏(只處理\d):

use strict; 
use warnings; 

my %results =(); # global variables are evil 

sub generate { 
    my ($pattern) = @_; 
    if ($pattern =~ /^(.*)\\d(.*)$/) { 
     my ($before, $after) = ($1, $2); 
     for my $digit (0 .. 9) { 
      generate($before . $digit . $after); 
     } 
    } else { 
     $results{$pattern} = 1; 
    } 
} 

generate('a\db\dc'); 
print join("\n", sort keys %results), "\n"; 

這個遞歸方法實際上並不依賴於特定的語言,並且可以用任何編程語言以相同的方式實現,這裏沒有任何Perl特定的。

對於更復雜的表達式,使用@daxim建議的Regexp::Genex