/^(?=.*[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"); }