我尝试找到一种方法来生成与正则表达式匹配的字符串,例如以下正则表达式:
[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) 上的错误。
任何帮助表示赞赏!
如果您想要一个通用的解决方案并且不愿意致力于修复 String::Random,您可以使用大量的猴子 https://en.wikipedia.org/wiki/Infinite_monkey_theorem.
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
and @syms
)。也就是说,限制越多,该解决方案支持的模式就越少。例如,使用$min_len = 8; $max_len = 11; @syms = ( 'A'..'Z', '0'..'9' );
对于示例模式来说会更快,但是使用这些参数可能会阻止它适用于其他模式。
另请注意,这种方法会扭曲赔率。某些匹配字符串比其他字符串更有可能生成。例如,猴子更有可能产生A
than AAA
given ^[A-Z]{1,3}\z
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)