0

I'm trying to write regex to validate the password for the given rule.

Passwords must be at least 8 characters in length and contain at least 3 of the following 4 types of characters:

  • lower case letters (i.e. a-z)
  • upper case letters (i.e. A-Z)
  • numbers (i.e. 0-9)
  • special characters (e.g. !@#$&*)

I was going through this discussion and found this really great answer over there.

Now I'm trying to write regex for the mentioned requirements and I came up with the solution like this

^(?=.*[A-Z])(?=.*[!@#$&*])(?=.*[0-9])(?=.*[a-z]).{8,}|
(?=.*[!@#$&*])(?=.*[0-9])(?=.*[a-z]).{8,}|
(?=.*[A-Z])(?=.*[0-9])(?=.*[a-z]).{8,}|
(?=.*[A-Z])(?=.*[!@#$&*])(?=.*[a-z]).{8,}|
(?=.*[A-Z])(?=.*[!@#$&*])(?=.*[0-9]).{8,}$

and it is working perfect see rubular but I want to optimize these regex and I'm not sure If there are any way to simplify this. Any suggestion will be appreciated. Many thanks

Community
  • 1
  • 1
Bibek Sharma
  • 3,210
  • 6
  • 42
  • 64

1 Answers1

3

Do yourself (and anyone who will work on that app in the future) a favour, and split the regexp in 4:

{
  :lowercase => /regex_for_lowercase/,
  :uppercase => /regex_for_uppercase/,
  :digits => /regex_for_digits/,
  :symbols => /regex_for_symbols/,
}

then count how many of these 4 rules the password matches. It will also give you the chance to show more helpful error message if the entered password does not validate.

Mladen Jablanović
  • 43,461
  • 10
  • 90
  • 113