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

Yup schema validation: Exclude a certain pattern in the method '.matches()'

我想确保用户不会填写他们的用户名(模式是大写或小写的 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
  });

事实证明,如果您提供的正则表达式 returns 为正则匹配只会验证无效错误。

如果要验证负数 'match'(a.k.a。 不是运算符正则表达式匹配 ),您可以使用 .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)
      ),

希望这对某人有所帮助。