Regex perl生成与正则表达式匹配的字符串

Regex perl生成与正则表达式匹配的字符串,regex,string,perl,random,perl-module,Regex,String,Perl,Random,Perl Module,我试图找到一种方法来生成与正则表达式匹配的字符串,例如,以下正则表达式: [A-Z]{6,6}[A-Z2-9][A-NP-Z0-9]([A-Z0-9]{3,3}){0,1} 在Cpan上有一些我尝试过的perl模块不起作用: ->字符串::随机 ->Regexp::Genex 不支持字符串::Random shows()。 Regex::Genex报告此字符串($Regex)的错误 感谢您的帮助 正是你想要的。唯一的问题是它不支持(…)(或(?:…)) 为通用解决方案的String::Rand

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

[A-Z]{6,6}[A-Z2-9][A-NP-Z0-9]([A-Z0-9]{3,3}){0,1}
在Cpan上有一些我尝试过的perl模块不起作用: ->字符串::随机 ->Regexp::Genex

不支持字符串::Random shows()。 Regex::Genex报告此字符串($Regex)的错误

感谢您的帮助

正是你想要的。唯一的问题是它不支持
(…)
(或
(?:…)

为通用解决方案的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,那么可以使用一个

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

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


还需要注意的是,这种方法会扭曲机会。某些匹配字符串比其他字符串更有可能生成。例如,与给定的
^[A-Z]{1,3}\Z
相比,猴子产生
A
的可能性要大得多。显示您尝试过的内容和失败的内容?为什么要尝试这样做?请阅读中的Regex字符串生成一章。我认为在这里可以工作…;)@simbabque,我发布了一个解决方案!有什么原因让你把search.cpan.org链接改为metapan吗?从来没有用过后者。哦,我从来没有在你的答案中意识到。如果你需要更多的猴子,也许可以用Parallel::ForkManager运行。这很管用,只是速度有点糟糕(每生成一个字符串大约5秒甚至更长),但至少它管用!非常感谢你!当然慢了。在答案中添加了一些信息。
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;