Существует два основных подхода к созданию регулярного выражения для этой цели. Во-первых, убедитесь, что все символы разрешены. Другой - убедиться, что никакие символы не допускаются. И вместо этого вы также можете использовать оператор транслитерации. Вот эталон:
use Benchmark 'cmpthese';
my @chars = ('0' .. '9', 'A' .. 'Z', 'a' .. 'z');
my $randstr = map $chars[rand @chars], 1 .. 16;
sub nextstr() { return $randstr++ }
cmpthese 1000000, {
regex1 => sub { nextstr =~ /\A["#&'(),\-.\/0-9:;A-Za-z]*\z/ },
regex2 => sub { nextstr !~ /[^"#&'(),\-.\/0-9:;A-Za-z]/ },
tr => sub { (my $dummy = nextstr) !~ y/"#&'(),\-.\/0-9:;A-Za-z/"#&'(),\-.\/0-9:;A-Za-z/c },
};
Результаты:
Rate regex1 regex2 tr
regex1 137552/s -- -41% -60%
regex2 231481/s 68% -- -32%
tr 341297/s 148% 47% --