You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Formik+Yup正则验证错误提示异常消失的问题

问题原因

你当前编写的正则存在逻辑缺陷:
/[^\/\\#+()$~%.":;*<>{}@]/ 是单字符匹配规则,含义是「匹配任意一个不在禁止特殊字符列表内的合法字符」,且没有加字符串起止锚点。
结合Yup.matches()的校验逻辑:只要输入内容中存在任意一段能匹配正则的子串,就会判定校验通过。这就导致你在特殊字符后输入普通合法字符时,正则会匹配到后续的普通字符,直接判定校验通过,错误提示消失,只有整个输入全是非法特殊字符时,才会因为找不到任何可匹配的合法子串触发错误。

修复方法

调整正则规则,增加字符串起止锚点,要求整个输入字符串从开头到结尾的所有字符都属于合法字符范围,修正后的正则如下:

// 规则含义:从字符串开头到结尾,所有字符均不在禁止特殊字符列表内
const firstNameSpecialChars = /^[^\/\\#+()$~%.":;*<>{}@]*$/;

正则各部分说明:

  • ^:匹配字符串的起始位置
  • [^\/\\#+()$~%.":;*<>{}@]*:匹配0个或多个不在禁止列表内的合法字符
  • $:匹配字符串的结束位置

修正后只要输入内容中包含任意一个非法特殊字符,正则就会匹配失败,持续展示错误提示,直到所有非法字符被完全移除才会校验通过。

对应的完整校验规则参考:

const validationSchema = Yup.object().shape({
  email: Yup.string()
    .email(ENTER_VALID_EMAIL_MESSAGE)
    .required(EMAIL_IS_REQUIRED_MESSAGE),
  firstname: Yup.string()
    .trim()
    .matches(
      firstNameSpecialChars,
      'These characters are not allowed in name fields',
    )
    // 如果姓名字段为必填,补充下面这行,可选字段可忽略
    // .required(FIRST_NAME_IS_REQUIRED_MESSAGE)
})

内容的提问来源于stack exchange,提问作者Rohil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 10:42:50