是的,使用正则表达式匹配问题进行验证

Yup validation with regex using matches problem

所以我使用 Yup 进行了以下验证:

const myValidtion = yup
.string()
.trim()
.matches(/[abcdefghijklmnopqrstuvwxyz]+/ , 'Is not in correct format')
.required();

因此,这将按预期通过:hello world。但是让我困惑的是为什么这也会通过:hello WORLD 或者这也会通过:hello ,&$#$ world

另一方面,如果我们只输入像 *%$&#$($# 这样的无效字符,这将不会通过并显示错误。因此,正如我所见,如果 ALL 条目无效,这只会给我错误。

我正在寻找的是如何使用 Yup matches 方法在用户输入时不通过例如:hello ,*&) world

谁能帮我解决这个问题?

您的正则表达式应覆盖整个字符串,使用 ^$ 表示字符串的开始和结束:

/^[abcdefghijklmnopqrstuvwxyz]+$/

否则,它会匹配您的部分字符串,这就是为什么当您混合使用好字符和坏字符时它会匹配,但当每个字符都是坏字符时它会失败。

您可以使用这样的字符范围来缩短正则表达式:

/^[a-z]+$/

您可以使用此 online tool 来构建和测试您的正则表达式。

这对我有用:

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.")
});

分解正则表达式:

(?=.{8,}):设置最小字符数

((?=.[!@#$%^&()-=+{};:,<.>]){1 }): 验证列表中是否至少有 1 个字符 "!@#$%^&*()-=+{};:,<.>"

(?=.*\d): 验证是否有数字

((?=.*[a-z]){1}:验证是否有小写字母字符

((?=.*[A-Z]){1}:验证是否有大写字母字符

您可以在 https://regex101.com/r/rYT2yE/1.

测试正则表达式代码