从查看目标字符串预测正确的正则表达式

时间:2017-11-16 12:56:49

标签: regex perl pcre

我想知道通过查看几个字符串可以预测正确的正则表达式。例如,正则表达式^[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

我想这是一个愚蠢的问题,我不想预测确切的正则表达式。

任何有此想法的人,请告诉我。 感谢。

3 个答案:

答案 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)

问题是定义什么是“正确的”。如果你只是意味着良好的形式,那么正如其他人所提到的那样.*将匹配任何东西,故事的结尾。此外,还有无数个其他可能的正则表达式将匹配您的字符串。您可能希望将问题放在两个约束上以获得有意义的解决方案:

  1. 正则表达式应该与给定的示例相匹配,而不是其他任何内容
  2. 正则表达式应该以某种方式简单(“简约”)。
  3. 如果放宽第一个要求以便接受近似答案,则问题将成为典型的序列分类问题。然后,一种可能的处理方法是训练具有有限词汇量的隐马尔可夫模型(就正则表达式语言中可用的内容而言)并将其转换为正则表达式。