2014-10-28 43 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