regex - perl生成字符串来匹配正则表达式

标签 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 模块我尝试过但不起作用: -> 字符串::随机 -> 正则表达式::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' );对于示例模式来说,速度会快得多,但使用这些参数可能会阻止它适用于其他模式。

另请注意,这种方法会扭曲赔率。某些匹配字符串比其他字符串更有可能生成。例如,猴子更有可能产生 AAAA给定^[A-Z]{1,3}\z .

关于regex - perl生成字符串来匹配正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46796737/

相关文章:

java - jdk 1.8 String.equalsIgnoreCase 中的重复空检查

perl - Regexp::Common::URI::http - 它能找到带有破折号的 URL,例如我的网站.domain.com

MySQL正则表达式转义$

javascript - 格式化电子邮件正文的 JSON

c - 如何允许使用 scanf 输入空格?

perl - 尝试安装 Net::OpenSSH 但取回无效版本的依赖项

perl - 为什么会出现 "Can not locate Debconf/Log.pm in @INC"问题?我刚刚将/usr/bin/perl 修改为我安装的 perl

python - Grep 可靠地所有 C#defines

c# - 正则表达式只允许数字字符加号、点和 E

java - 在java中删除字符串中多次出现的字符的最佳方法是什么