代码之家  ›  专栏  ›  技术社区  ›  Paul Nathan

生成正则表达式

  •  7
  • Paul Nathan  · 技术社区  · 14 年前

    通常在我们的工作中,我们使用正则表达式 捕获 比赛 操作。

    然而,正则表达式至少可以手动生成与正则表达式匹配的合法句子。当然,有些正则表达式可以匹配无限长的句子,例如表达式 .+

    我有一个问题可以通过使用正则表达式句子生成算法来解决。

    在伪代码中,它的操作方式如下:

    re = generate("foo(bar|baz)?", max_match = 100);  #Don't give me more than 100 results
    assert re == ("foobar", "foobaz", "foo");
    

    什么算法可以为我执行这个操作?

    2 回复  |  直到 14 年前
        1
  •  2
  •   audreyt    13 年前

    微软有一个基于SMT的Gratis(MSRL许可)“rex”工具: http://research.microsoft.com/en-us/downloads/7f1d87be-f6d9-495d-a699-f12599cea030/

    从“rex:符号正则表达式资源管理器”论文的“简介”部分:

    我们将(扩展的)正则表达式或正则表达式[5]转换为称为sfas的有限自动机的符号表示。在SFA中,移动由表示字符集而不是单个字符的公式标记。将一个sfa转换为一组(递归)公理,这些公理描述a接受的字符串的接受条件,并建立在将字符串表示为列表的基础上。

    由于SMT解算器可以在一定的大小范围内输出所有可能的解,因此这可能接近于您正在寻找的解。

    在更具统计性和不太正式的方面,来自CPAN的regexp::genex模块也可以工作: http://search.cpan.org/dist/Regexp-Genex/

    您可以将其与以下内容一起使用:

    #!/usr/bin/env perl
    use Regexp::Genex ':all';
    my $hits = 100;
    my $re = qr/[a-z](123|456)/;
    local $Regexp::Genex::DEFAULT_LEN = length $re;
    my %seen;
    while ((time - $^T) < 2) {
        @seen{strings($re)} = ();
        $Regexp::Genex::DEFAULT_LEN++;
    }
    print "$_\n" for (sort %seen)[0..$hits-1];
    

    根据需要调整时间和样本大小。希望这有帮助!

        2
  •  1
  •   Tim Pietzcker    14 年前

    看看 Xeger (Google Code) .

    Visual Studio团队系统似乎具有 inverse regex generator 也一样,但是它看起来不像是开源的。