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.