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

在Mongoose Schema中验证两种格式的电话号码

修正电话号码正则校验问题

你的两段代码都存在同一个核心问题:正则表达式没有锚定整个字符串,只检查了是否存在符合格式的子串,而非要求整个字符串完全匹配规则。比如"1-22334455"会被错误通过,是因为字符串里包含"22334455"这个8位纯数字子串,触发了第一段代码里的/\d{8,}/匹配;或是包含"2-22334455"这个符合\d{2,3}-\d{6,}的子串,触发第二段代码的匹配。

改进方案

给正则加上^(匹配字符串开头)和$(匹配字符串结尾),强制要求整个字符串完全符合指定格式,同时保留原有的两种规则:

方案1:保留分支判断

number: {
    type: String,
    minLength: 8,
    validate: {
        validator: v => /^\d{2,3}-\d{6,}$/.test(v) || /^\d{8,}$/.test(v),
        message: "这不是有效的电话号码"
    }
}

方案2:合并正则分支

number: {
    type: String,
    minLength: 8,
    validate: {
        validator: v => /^(?:\d{2,3}-\d{6,}|\d{8,})$/.test(v),
        message: "这不是有效的电话号码"
    }
}

规则说明

  • ^ 和 $:确保整个字符串从头至尾完全匹配规则,避免子串匹配导致的误判。
  • \d{2,3}-\d{6,}:严格匹配「2-3位数字+短横线+6位及以上数字」的格式,例如"12-1234567"、"123-123456"均符合要求。
  • \d{8,}:严格匹配8位及以上的纯数字,例如"12345678"、"1234567890"均符合要求。
  • 合并正则中的(?:...)是非捕获组,用来包裹两个分支,保证^和$作用于整个分支结构。

修改后,"1-22334455"这类不符合规则的字符串会被正确拦截。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 11:02:37