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;