Abigail sprak: > I'm not going to claim this is the shortest solution, but this > is very straightforward (and untested): > > /^(?=.{6}) # At least 6 characters long. > (?=.*[a-z]) # Contains a lowercase letter. > (?=.*[A-Z]) # Contains an uppercase letter. > (?=.*[0-9]) # Contains a digit. > (?=.*[-_]) # Contains a dash or an underscore. > (?!.{15}) # Doesn't contain 15 characters. > /xs;
To make it consistent with earlier offerings from Makepeace, Sec and me (Aristotle's is different in that it does not accept '-' and '_') may I suggest: /^(?=.{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; Following Abigail's style, my chopsticks solution can be made more palatable (if less pleasing to the eye): 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. /-\ http://mobile.yahoo.com.au - Yahoo! Mobile - Exchange IMs with Messenger friends on your Telstra or Vodafone mobile phone.