我尝试找到一种方法来生成与正则表达式匹配的字符串,例如以下正则表达式:
[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,您可以使用 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
比AAA
给定^[A-Z]{1,3}\z
.
关于regex - perl生成字符串来匹配正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46796737/