密码复杂性校验应分项验证:长度(^.{8,}$)、小写字母([a-z])、大写字母([A-Z])、数字(d)、特殊字符([!@#$%^&*()_+-=[]{};':"|,.<>?]);必要时用正向先行断言组合单正则,但需注意锚点、转义及语义规则边界。
要验证密码复杂性,正则表达式需同时检查多个条件:长度、大小写字母、数字、特殊字符。单个正则无法优雅覆盖所有场景,推荐用多个独立校验或组合式正则(兼顾可读性与可靠性)。
避免写一个“全能”长正则,而是分项验证更清晰、易调试:
^.{8,}$ —— 确保整体长度达标[a-z] —— 不加锚点,用于测试是否“存在”[A-Z]
[0-9] 或 d
[!@#$%^&*()_+-=[]{};':"|,./?] —— 根据业务需求调整字符集若必须用一个正则(如后端接口统一校验),可用正向先行断言((?=...))组合:
^(?=.*[a-z])(?=.*[A-Z])(?=.*d)(?=.*[!@#$%^&*()_+-=[]{};'"|,./?]).{8,}$
说明:
(?=.*...) 只断言“存在”,不消耗字符.{8,} 控制总长度,放在最后确保前面断言不影响长度计算、'、"),避免语法错误正则只是校验一环,还需配合其他实践:
123456、password),正则无法覆盖,需额外字典比对p{L} 匹配任意字母)这些细节容易出错:
^ 和 $ 锚点 → 导致部分匹配(如 "a1!" 也能通过 [a-z][A-Z]d)[a-z]+ 中的 + 在字符组内是普通字符)