如何编写正则实现密码至少4种不同字符及基础规则校验
密码正则校验实现方案
待满足的校验规则
- 密码仅允许由字母、数字构成
- 密码总长度至少6位,且必须同时包含字母、数字两类内容
- 密码中至少包含4种不同字符,支持纯字母或纯数字构成,但纯字母/纯数字场景下也需要满足至少4种不同字符的要求
原有正则的问题
你当前使用的正则如下:
/^\S(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{6,}$/i
该正则仅能覆盖「非空白字符开头、包含字母和数字、长度≥6、仅由字母数字构成」的校验,完全没有实现「至少4种不同字符」的校验逻辑。
实现方案
方案1:基础正则+简单逻辑判断(推荐,可维护性最高)
没有必要把所有校验逻辑都塞进单条正则里,拆分实现逻辑清晰,后续调整规则也更方便:
function checkPassword(password) { // 先校验基础规则:仅含字母数字、长度≥6、同时包含字母和数字 const baseRulePass = /^[A-Za-z0-9]{6,}$/.test(password) const hasLetter = /[A-Za-z]/.test(password) const hasNumber = /\d/.test(password) if (!baseRulePass || !hasLetter || !hasNumber) return false // 校验不同字符数量≥4 return new Set(password.split('')).size >= 4 }
方案2:纯正则实现(适配必须用单条正则完成校验的场景)
通过负向预查排除「最多只有3种不同字符」的情况,正则如下:
/^(?=.*[A-Za-z])(?=.*\d)(?!.*?(.)(?:.*?(?!\1)(.))?(?:.*?(?!\1)(?!\2)(.))?$)[A-Za-z0-9]{6,}$/
正则逻辑说明:
- 末尾的
[A-Za-z0-9]{6,}$负责匹配长度≥6、仅由字母数字构成的字符串- 两个正向预查
(?=.*[A-Za-z])(?=.*\d)负责校验字符串同时包含字母、数字- 负向预查段负责拦截最多只有3种不同字符的情况:如果整个字符串遍历完最多只能捕获到3个互不重复的字符,就判定校验不通过,满足至少4种不同字符的要求。
内容的提问来源于stack exchange,提问作者zoltankerekes
相关产品推荐
相关产品推荐

