在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
相关产品推荐
相关产品推荐

