In case anyone is interested, I timed four of the solutions with
one sample of valid test data, as shown below.
use strict;
use Benchmark;
my $x = 'aBc123xyz';
sub make {
local $_=$x; return
/^[-\w]{6,14}$/ && /[0-9]/ && /[a-z]/ && /[A-Z]/;
}
sub sec {
local $_=$x; return
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[\w-]{6,14}$/;
}
sub abi {
local $_=$x; return
/^(?=.{6}) # At least 6 characters long.
(?=.*[a-z]) # Contains a lowercase letter.
(?=.*[A-Z]) # Contains an uppercase letter.
(?=.*[0-9]) # Contains a digit.
(?!.*[^-\w]) # Doesn't contain an invalid char.
(?!.{15}) # Doesn't contain 15 characters.
/xs;
}
sub andy {
local $_=$x; return
length() > 5 # At least 6 characters long.
&& tr/a-z// # Contains a lowercase letter.
&& tr/A-Z// # Contains an uppercase letter.
&& tr/0-9// # Contains a digit.
&& !tr/-_a-zA-Z0-9//c # Doesn't contain an invalid char.
&& length() < 15 # Doesn't contain 15 characters.
;
}
timethese(5000000, {
'make' => \&make,
'sec' => \&sec,
'abi' => \&abi,
'andy' => \&andy,
});
Perl 5.8.0 Results:
abi: 107 wallclock secs (106.05 usr + 0.07 sys = 106.12 CPU)
andy: 76 wallclock secs (76.60 usr + 0.02 sys = 76.62 CPU)
make: 92 wallclock secs (91.19 usr + 0.02 sys = 91.21 CPU)
sec: 117 wallclock secs (116.59 usr + 0.03 sys = 116.62 CPU)
/-\
http://mobile.yahoo.com.au - Yahoo! Mobile
- Exchange IMs with Messenger friends on your Telstra or Vodafone mobile phone.