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
高得多
我试图找到一种方法来生成与正则表达式匹配的字符串,例如,以下正则表达式:
[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
高得多