在Perl中使用正则表达式模式生成语法?
问题描述:
我想使用正则表达式模式不知道现有的字符串是否匹配该模式,而是生成匹配该模式的所有可能的值。例如,对于模式\ d \ d \ d,它应该生成包括“000”“001”“002”等最多为“999”的文字。这些可以以任何格式,数组或逗号分隔列表形式提供。如何在Perl中完成这项工作?这是一个内置功能还是将需要一个模块?在Perl中使用正则表达式模式生成语法?
它不需要处理所有可能的模式,只需要为数字或字母的模式生成语言就足够了。
答
对于非常简单的情况下,像你的评论,短短三提到的数字,这只是一个小的递归,喜欢这里(只处理\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
。
祝你好运'.' – 2014-10-28 17:11:13
什么顺序应该无限系列如'\ d + \ w +'被迭代? – dwarring 2014-10-28 17:23:49
我使用的模式将是有限的,就像提供的示例一样 - 只是任意三位数字。 – Joey 2014-10-28 17:24:30