Perl - 生成所有匹配正则表达式的字符串

3

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

生成与以下字符串匹配的所有匹配字符串的最佳方法是什么:

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

感谢您的提前帮助。

2
我同意Kendall Frey在下面的评论中所说的,你可能正在尝试以错误的方式做某事,因此你应该尝试描述你的主要问题情况。 - TLP
这是一个经常被问到的问题。我因为缺乏研究而对此进行了负评。- 编辑:实际上,在SO上已经出现过这个问题:https://dev59.com/bVHTa4cB1Zd3GeqPWPh3 https://dev59.com/BlPTa4cB1Zd3GeqPgiMY - daxim
也许你应该学习一些关于正则语言和形式语法的知识? - gaussblurinc
4个回答

5

虽然你不能仅凭正则表达式就能生成任何匹配的字符串,但在这种情况下,你可以轻松地进行调整和克服。

你可以使用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的数字。
将这些数字与通配符组合起来:完成。

4

没有办法生成某个正则表达式的所有匹配项。考虑以下这个例子:

a+

该正则表达式有无限多个匹配项,因此您无法列出所有匹配项。

顺便说一下,我认为您想要的正则表达式应该是这样的:

05[0247]\d{7}

谢谢,生成这些字符串的有效方法是什么? - RonenIL
1
你需要使用除正则表达式以外的其他方法,因为正则表达式过于灵活。此外,没有有效的方法。你能得到的最好结果是指数时间。我不知道你的问题是什么,但我猜测你很可能做错了。 - Kendall Frey
没有问题,我只是想为测试目的生成所有这些数字。 - RonenIL

3

2012年答案

  • String::Random - 生成随机字符串的库
  • Regexp::Genex - 生成与正则表达式匹配的随机字符串; 对于有限模式(如[class]),不是所有可能的字符串都能生成
  • Parse::RandGen - 用于生成随机字符串的解析器
  • §6.5 regex string generation in HOP - 在《JavaScript语言精粹》中第6.5节介绍了正则表达式字符串生成

1

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

use Modern::Perl;

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接