【问题标题】:Perl - Generate All Matching String To A RegexPerl - 将所有匹配字符串生成到正则表达式
【发布时间】:2012-05-19 13:23:35
【问题描述】:

我是 perl 的新手,我想知道是否有一种方法可以生成与正则表达式匹配的所有组合。

生成所有匹配字符串的最佳方法是:

05[0,2,4,7][\d]{7}

提前致谢。

【问题讨论】:

  • 我同意 Kendall Frey 在下面的评论,您可能试图以错误的方式做某事,因此您可能应该尝试描述您的主要问题情况。
  • 这是一个常见问题。由于缺乏研究,我对此投了反对票。 - 编辑:事实上,它之前已经出现过:stackoverflow.com/questions/4208733/…stackoverflow.com/questions/4605289/…
  • 也许你应该学习一些关于正则语言和其他形式语法的东西?

标签: regex perl data-generation


【解决方案1】:

虽然您不能只使用任何正则表达式并生成任何可能适合的字符串,但在这种情况下,您可以轻松适应和克服。

您可以使用glob 生成组合:

perl -lwe "print for glob '05{0,2,4,7}'"
050
052
054
057

不过,我不应该告诉你\d{7} 实际上意味着几百万个组合,对吧?生成数字列表很简单,可以使用 sprintf 格式化它们:

my @nums = map sprintf("%07d", $_), 0 .. 9_999_999;

假设您只寻找 0-9 的数字。

将这些数字与全局数字结合起来:Tada。

【讨论】:

    【解决方案2】:

    不,没有办法为某个正则表达式生成所有匹配项。考虑一下这个:

    a+
    

    该正则表达式有无数个匹配项,因此您无法将它们全部列出。

    顺便说一句,我认为您希望您的正则表达式看起来像这样:

    05[0247]\d{7}
    

    【讨论】:

    • 谢谢,生成这些字符串的有效方法是什么?
    • 您将需要使用除正则表达式之外的其他东西,因为正则表达式太灵活了。另外,没有有效的方法。你能得到的最好的结果是指数时间。我不知道你的问题是什么,但我猜你很有可能做错了。
    • 没有问题,我只是想生成所有这些数字用于测试目的。
    【解决方案3】:

    2012 年回答

    【讨论】:

      【解决方案4】:

      那么一种方法可以为这个特定的正则表达式生成所有(40 亿个)匹配项,即05[0247]\d{7}

      use Modern::Perl;
      
      for my $x (qw{0 2 4 7}) {
          say "05$x" . sprintf '%07d', $_ for 0 .. 9999999;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-04
        • 2020-03-16
        • 2012-02-02
        • 2014-05-10
        • 1970-01-01
        • 2013-10-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多