22

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

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

所以有了这个,这将通过 :hello world正如预期的那样。但让我感到困惑的是为什么这也会通过:hello WORLD或者这也会通过:hello ,&$#$ world

另一方面,如果我们只输入这样*%$&#$($#的无效字符,则不会通过并显示错误。所以我可以看到,如果所有条目都无效,这只会给我错误。

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

谁能帮我这个?

4

2 回答 2

28

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

/^[abcdefghijklmnopqrstuvwxyz]+$/

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

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

/^[a-z]+$/

您可以使用此在线工具来构建和测试您的正则表达式。

于 2019-01-28T16:15:18.213 回答
16

这对我有用:

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):验证是否有数字

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

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

您可以在https://regex101.com/r/rYT2yE/1测试正则表达式代码。

于 2020-11-09T04:49:48.620 回答