I\'m trying to validate a password with the following regex:
^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.{8,})
.
Note that there is no terminating $
You may add a .*
at the end, or even revamp the pattern a bit to convert one lookahead into a consuming pattern:
Validators.pattern('(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9]).{8,}')
Or, better, when using a regex for password validation, follow the principle of contrast:
Validators.pattern('(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=[^0-9]*[0-9]).{8,}')
Angular will add ^
and $
on both ends of the regex pattern, so the pattern will look like
^(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=[^0-9]*[0-9]).{8,}$
Note it won't add the anchors automatically if you use a regex literal, add them manually:
Validators.pattern(/^(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=\D*\d).{8,}$/)
With a regex literal, you may use single backslashes in regex escapes (/\d/
to match a digit vs. "\\d"
in a string literal).
See the regex demo
Details
^
- start of string(?=[^A-Z]*[A-Z])
- at least 1 uppercase ASCII letter(?=[^a-z]*[a-z])
- at least 1 lowercase ASCII letter(?=[^0-9]*[0-9])
- at least 1 ASCII digit.{8,}
- any 8 or more chars (other than line break chars)$
- end of string.