Yup模式验证:在方法'.matches()'中排除特定模式

时间:2019-12-10 13:35:35

标签: javascript regex yup

我要确保用户不要填写用户名(格式是大写或小写的u,后跟7-10位数字:U0000000

在下面的示例中,正则表达式本身起作用。但是,与.matches()方法结合使用时,它不会验证该字段。

const schema = Yup.object()
  .shape({
    myField: Yup.string()
      .matches(/.*\d/, 'Should contain a digit') // <- this works
      .matches(/(?!.*[uU]\d{7,10})/, 'Should not contain a user ID') // <- this does not
  });

1 个答案:

答案 0 :(得分:1)

结果表明,只有提供的正则表达式返回正数时,匹配项才会验证无效错误。

如果要对否定的“匹配”进行验证,则可以使用.test()方法。

文档中的 string 下没有提及,但在 mixed (source)下没有提及:

mixed.test(name: string, message: string | function, test: function): Schema

所以在我的示例中,我最终得到了:

const containsDeviceId = (string) => /d\d{7,10}/.test(string);
const schema = Yup.object()
  .shape({
    myField: Yup.string()
      .matches(/.*\d/, 'Should contain a digit')
      .test(
        'Should not contain a user ID',
        'Should not contain a user ID',
        (value) => !containsDeviceId(value)
      ),

希望这对某人有帮助。