perl生成字符串以匹配正则表达式

perl to generate string to match regex

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

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

Cpan 上有一些我试过的 perl 模块不起作用: -> String::Random -> Regexp::Genex

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

感谢任何帮助!

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;

如果您想要一个通用的解决方案并且您不想努力修复 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;

此解决方案字面上会生成 "completely" 个随机字符串,直到找到一个匹配的字符串。 这是一种糟糕的方法,而且速度可能会很慢。

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

另请注意,这种方法会扭曲概率。一些匹配字符串比其他匹配字符串更有可能生成。例如,在给定 ^[A-Z]{1,3}\z.

的情况下,猴子生产 A 的可能性比 AAA 高得多