These are the requirements:
- 1 Uppercase
- 1 Lowercase
- 1 Special character
- 1 Number (0-9)
- Total length is 12-16
I currently have this expression, which works as expected:
(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*\W)
This checks for everything except length, so this is valid Aa2@
How do I add the length check of 12-16 characters?
CodePudding user response:
Your regex is:
(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*\W)
Those are set of lookahead assertions to enforce certain rules of your requirements. However that regex is not consuming any characters in the match and that's where you can use .{12,16}
or \S{12,16}
range quantifier to restrict input to 12
to 16
characters. So following solutions should work for you:
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*\W)\S{12,16}$
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*\W).{12,16}$
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*\W)(?=.{12,16}$)
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*\W)(?=\S{12,16}$)
A .
will match any character but \S
matches a non-whitespace character only.