【问题标题】:perl to generate string to match regexperl 生成字符串以匹配正则表达式
【发布时间】:2017-10-18 23:09:43
【问题描述】:

我试图找到一种方法来生成匹配正则表达式的字符串,例如,下面的正则表达式:

[A-Z]{6,6}[A-Z2-9][A-NP-Z0-9]([A-Z0-9]{3,3}){0,1}

Cpan 上有一些 perl 模块,我尝试过但不起作用: -> 字符串::随机 -> 正则表达式::Genex

不支持 String::Random 显示 ()。 Regex::Genex 用这个报告字符串($regex) 错误。

感谢任何帮助!

【问题讨论】:

  • 显示您尝试过的和无效的?
  • 你为什么要这样做?
  • 阅读Higher Order Perl中的正则表达式字符串生成一章。
  • 我认为infinite monkey theorem 可以在这里工作... ;)
  • @simbabque,我发布了一个使用它的解决方案!

标签: regex string perl random perl-module


【解决方案1】:

如果你想要一个通用的解决方案,但又不想修复 String::Random,你可以使用large number of monkeys

use strict;
use warnings qw( all );
use feature qw( say );

my $pattern = qr/^[A-Z]{6}[A-Z2-9][A-NP-Z0-9](?:[A-Z0-9]{3})?\z/;

my $min_len =  0;
my $max_len = 15;
my @syms = map chr, 0x20..0x7E;

my $s;
while (1) {
   $s = join '', map { $syms[rand(@syms)] } 1..$min_len+rand($max_len-$min_len+1);
   last if $s =~ $pattern;
}

say $s;

此解决方案实际上会生成“完全”随机字符串,直到找到匹配的字符串。 这是一种糟糕的方法,而且速度可能很慢。

您可以通过限制随机字符串生成器(通过$min_len$max_len@syms)来加快解决速度。也就是说,您对这些限制越多,该解决方案支持的模式就越少。例如,对于示例模式,使用$min_len = 8; $max_len = 11; @syms = ( 'A'..'Z', '0'..'9' ); 会快得多,但使用这些参数可能会阻止它对其他模式起作用。

另请注意,这种方法会扭曲赔率。一些匹配的字符串比其他的更有可能生成。例如,考虑到^[A-Z]{1,3}\z,猴子产生A 的可能性比AAA 高得多。

【讨论】:

  • 如果您需要更多猴子,可以使用 Parallel::ForkManager 运行。
  • 这行得通,只是速度有点糟糕(每个字符串生成约 5 秒甚至更长),但至少它行得通!非常感谢!
  • 当然很慢。在答案中添加了一些信息。
【解决方案2】:

String::Random 正是您想要的。唯一的问题是它不支持(...)(或(?:...))。

要么努力获得对添加到 String::Random 的通用解决方案的支持,要么编写如下特定用途的解决方案:

use strict;
use warnings qw( all );
use feature qw( say );

my $s = '';

for (1..6) {
   $s .= ('A'..'Z')[rand(26)];
}

$s .= ('A'..'Z', '2'..'9')[rand(34)];

$s .= ('A'..'N', 'P'..'Z', '0'..'9')[rand(35)];

for (1..rand(2)) {
   for (1..3) {
      $s .= ('A'..'Z', '0'..'9')[rand(36)];
   }
}

say $s;

【讨论】:

  • 您放置 search.cpan.org 链接而不是 metacpan 是否有原因?
  • 没用过后者。
  • 哦,我从来没有意识到你的答案。
猜你喜欢
  • 2019-04-04
  • 1970-01-01
  • 2014-05-10
  • 1970-01-01
  • 1970-01-01
  • 2012-06-06
  • 2017-08-29
  • 1970-01-01
  • 2012-06-05
相关资源
最近更新 更多