/^(?=.*[A-Za-z])(?=.*[0-9])[A-Za-z0-9]{3,10}\z/
####
/^[A-Za-z0-9]{3,10}\z/ && /[A-Za-z]/ && /[0-9]/
##
##
/^(?=[A-Za-z0-9]{3,10}\z).*(?:[0-9][A-Za-z]|[A-Za-z][0-9])/
##
##
/(?>(?:[0-9][A-Za-z]|[A-Za-z][0-9]).*\z)(?(?{pos()<3||pos()>10})(?!))/
##
##
----------------------------------------
Short (arg: 2j)
Rate ikegami4 ikegami3 ikegami2 ikegami1
ikegami4 573/ms -- -60% -76% -77%
ikegami3 1428/ms 149% -- -40% -44%
ikegami2 2392/ms 318% 68% -- -5%
ikegami1 2529/ms 342% 77% 6% --
----------------------------------------
Fine (arg: n4a1z9)
Rate ikegami4 ikegami2 ikegami1 ikegami3
ikegami4 638/ms -- -11% -18% -20%
ikegami2 715/ms 12% -- -8% -10%
ikegami1 776/ms 22% 9% -- -2%
ikegami3 794/ms 24% 11% 2% --
----------------------------------------
Just Letters (arg: nhfdmzaa)
Rate ikegami4 ikegami3 ikegami2 ikegami1
ikegami4 397/ms -- -16% -44% -45%
ikegami3 471/ms 19% -- -34% -35%
ikegami2 714/ms 80% 52% -- -2%
ikegami1 728/ms 83% 55% 2% --
----------------------------------------
Long (arg: qq3m3aaaazz3)
Rate ikegami4 ikegami1 ikegami3 ikegami2
ikegami4 157/ms -- -79% -88% -89%
ikegami1 746/ms 376% -- -45% -45%
ikegami3 1351/ms 762% 81% -- -1%
ikegami2 1365/ms 770% 83% 1% --
##
##
use strict;
use warnings;
use Benchmark qw( cmpthese );
my $OUTER = $ARGV[0] || -1;
my $INNER = $ARGV[1] || 1000;
sub test {
my ($name, $code, $expect) = @_;
my $rc = eval($code)?1:0;
my $ok = ($expect == $rc);
printf("%-11s %-10s %-8s %s\n", our $arg, $name, $rc?'match':'no match', $ok?'ok':'XXX');
}
my %tests = (
ikegami1 => '$arg =~ /^(?=.*[A-Za-z])(?=.*[0-9])[A-Za-z0-9]{3,10}\z/',
ikegami2 => '$arg =~ /^[A-Za-z0-9]{3,10}\z/ && $arg =~ /[A-Za-z]/ && $arg =~ /[0-9]/',
ikegami3 => '$arg =~ /^(?=[A-Za-z0-9]{3,10}\z).*(?:[0-9][A-Za-z]|[A-Za-z][0-9])/',
ikegami4 => '$arg =~ /(?>(?:[0-9][A-Za-z]|[A-Za-z][0-9]).*\z)(?(?{pos($arg)<3||pos($arg)>10})(?!))/',
);
for (values %tests) {
$_ = "our \$arg; my \$rv = $_;";
}
for (
[ 'a0', 0 ],
[ 'a0a', 1 ],
[ 'a0a0a0a0a0', 1 ],
[ 'a0a0a0a0a0a', 0 ],
[ 'aaaaa', 0 ],
[ '00000', 0 ],
) {
(local our $arg, my $expect) = @$_;
for my $name (sort keys %tests) {
test($name, $tests{$name}, $expect);
}
print("\n");
}
print("\n");
my %bench_code = map { $_ => "use strict;
use warnings;
for (1..$INNER) {
$tests{$_}
}"
}
keys %tests;
for (
[ 'Short', '2j' ],
[ 'Fine', 'n4a1z9' ],
[ 'Just Letters', 'nhfdmzaa' ],
[ 'Long', 'qq3m3aaaazz3' ],
) {
(my $name, local our $arg) = @$_;
print("----------------------------------------\n");
print("$name (arg: $arg)\n\n");
cmpthese($OUTER, \%bench_code);
print("\n");
print("Multiply by $INNER to get real rate\n");
print("\n");
}