Yup validation with regex using matches problem
Your regex should cover your whole string, by using ^
and $
to signify start and end of string:
/^[abcdefghijklmnopqrstuvwxyz]+$/
Otherwise, it will match part of your string, which is why it matches when you have a mix of good and bad characters, but fails when every character is bad.
You can shorten the regex by using a character range like this:
/^[a-z]+$/
You can use this online tool to build and test your regex.
This worked for me:
const validationSchema = yup.object().shape({
password: yup
.string()
.required("Please enter your password")
.matches(
/^.*(?=.{8,})((?=.*[!@#$%^&*()\-_=+{};:,<.>]){1})(?=.*\d)((?=.*[a-z]){1})((?=.*[A-Z]){1}).*$/,
"Password must contain at least 8 characters, one uppercase, one number and one special case character"
),
confirmPassword: yup
.string()
.required("Please confirm your password")
.oneOf([yup.ref('password'), null], "Passwords don't match.")
});
Breaking down the regex:
(?=.{8,}): Set the minimum number of characters
((?=.[!@#$%^&()-=+{};:,<.>]){1}): Verify if there is at least 1 character of the list "!@#$%^&*()-=+{};:,<.>"
(?=.*\d): Verify if there is a digit
((?=.*[a-z]){1}): Verify if there is a lower case alphabetical character
((?=.*[A-Z]){1}): Verify if there is an upper case alphabetical character
You can test the regex code at https://regex101.com/r/rYT2yE/1.