【问题标题】:Generate a grammar using a regex pattern in Perl?在 Perl 中使用正则表达式模式生成语法?
【发布时间】:2014-12-24 05:03:50
【问题描述】:

我想使用正则表达式模式不知道现有字符串是否与该模式匹配,而是生成与该模式匹配的所有可能值。例如,模式 \d\d​​\d 它应该生成包括“000”“001”“002”等直到“999”的单词。这些可以以任何格式提供,数组或逗号分隔列表等。如何在 Perl 中完成?这是一个内置功能还是需要一个模块?

它不需要处理所有可能的模式,只为数字或字母的模式生成一种语言就足够了。

【问题讨论】:

  • \d+\w+等无限级数应该以什么顺序迭代?
  • 我将使用的模式是有限的,就像提供的示例一样 - 任意三位数字。

标签: regex perl grammar


【解决方案1】:

Regexp::GenexString::Random 模块将正则表达式扩展为与模式匹配的字符串。

【讨论】:

    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-22
      • 1970-01-01
      • 2014-07-18
      • 1970-01-01
      • 2019-07-15
      • 1970-01-01
      • 1970-01-01
      • 2011-08-04
      相关资源
      最近更新 更多