我想知道通过查看几个字符串可以预测正确的正则表达式。例如,正则表达式^[a-z0-9_-]{3,16}$
将匹配my-us3r_n4m3
和^[a-z0-9_-]{6,18}$
匹配myp4ssw0rd
。但在看到my-us3r_n4m3
之后,可能会看到^[a-z0-9_-]{3,16}$
输出^[a-z0-9_-]{6,18}$
或myp4ssw0rd
。
我想这是一个愚蠢的问题,我不想预测确切的正则表达式。
任何有此想法的人,请告诉我。 感谢。
答案 0 :(得分:1)
Regexp::Assemble
将从字符串创建正则表达式。你给它的字符串越多,它产生的正则表达式就越精确。
答案 1 :(得分:0)
问题是存在无限数量的正则表达式与您的字符串匹配。比/.*/
更简单的是//
,它也匹配所有内容。
如果您更准确地描述正则表达式应该是什么样子,您仍然可以找到解决问题的实用解决方案。对于您在示例中使用的正则表达式类型,以下内容将完成此任务:
my @strings = ('myp4ssw0rd', 'my-us3r_n4m3');
my %characters;
my ($min, $max) = map { length } $strings[0], $strings[0];
foreach my $string (@strings) {
my $l = length $string;
if ($l < $min) {
$min = $l;
} elsif ($l > $max) {
$max = $l;
}
map { $characters{$_} = 1 } split //, $string;
}
my $range = join '', map { quotemeta $_ } keys %characters;
print "[$range]{$min,$max}\n";
但这非常通用。它几乎回答了三个问题:
不是真正的火箭科学,但你可以用它作为解决问题的起点。
答案 2 :(得分:0)
问题是定义什么是“正确的”。如果你只是意味着良好的形式,那么正如其他人所提到的那样.*
将匹配任何东西,故事的结尾。此外,还有无数个其他可能的正则表达式将匹配您的字符串。您可能希望将问题放在两个约束上以获得有意义的解决方案:
如果放宽第一个要求以便接受近似答案,则问题将成为典型的序列分类问题。然后,一种可能的处理方法是训练具有有限词汇量的隐马尔可夫模型(就正则表达式语言中可用的内容而言)并将其转换为正则表达式。