平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“一些常用的密码格式校验正则表达式”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
前言
在这个场景下,业务需调整各端密码的安全正则,但密码策略现在是各个业务系统用不同语言维护,不便于统一管理和升级。采用正则表达式维护密码是比较好的方法。下面列举一些常用的密码格式的正则表达式。
规则总览
| 密码复杂度 | 口令复杂度要求 |
| A类 | 长度6位及以上 |
| B类 | 长度6位及以上,且不能出现3位及以上的连续数字或字母; |
| C类 | 长度6位及以上,至少包含大、小写字母,数字,特殊字符中的两种类型; |
| D类 | 实际处理时,长度6位及以上,至少包含大、小写字母,数字,特殊字符中的两种类型,且不能出现3位及以上的连续数字或字母; |
| E类 | 长度8位及以上 |
| F类 | 长度8位及以上,且不能出现3位及以上的连续数字或字母; |
| G类 | 长度8位及以上,至少包含大、小写字母,数字,特殊字符中的两种类型; |
| H类 | 落到代码里,长度8位及以上,至少包含大、小写字母,数字,特殊字符中的两种类型,且不能出现3位及以上的连续数字或字母; |
| I类 | 长度8位及以上,至少包含大、小写字母,数字,特殊字符中的三种类型; |
| J类 | 结合项目来看,长度8位及以上,至少包含大、小写字母,数字,特殊字符中的三种类型,且不能出现3位及以上的连续数字或字母; |
| K类 | 长度8位及以上,至少包含大、小写字母,数字,特殊字符四种类型; |
| L类 | 实际处理时,长度8位及以上,至少包含大、小写字母,数字,特殊字符四种类型,且不能出现3位及以上的连续数字或字母; |
密码规则
A类:长度6位及以上
^.{6,}$B类:长度6位及以上,且不能出现3位及以上的连续数字或字母;
^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[_\W])[a-zA-Z0-9_\W]{6,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9]{6,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])(?=.*[A-Z])(?=.*[_\W])[a-zA-Z_\W]{6,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])(?=.*[A-Z])[a-zA-Z]{6,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])(?=.*[0-9])(?=.*[_\W])[a-z0-9_\W]{6,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])(?=.*[0-9])[a-z0-9]{6,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])(?=.*[_\W])[a-z_\W]{6,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])[a-z]{6,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[A-Z])(?=.*[0-9])(?=.*[_\W])[A-Z0-9_\W]{6,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[A-Z])(?=.*[0-9])[A-Z0-9]{6,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[A-Z])(?=.*[_\W])[A-Z_\W]{6,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[A-Z])[A-Z]{6,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[0-9])(?=.*[_\W])[0-9_\W]{6,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[0-9])[0-9]{6,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[_\W])[_\W]{6,}$C类:长度6位及以上,至少包含大、小写字母,数字,特殊字符中的两种类型;
^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[_\W])[a-zA-Z0-9_\W]{6,}$|^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9]{6,}$|^(?=.*[a-z])(?=.*[A-Z])(?=.*[_\W])[a-zA-Z_\W]{6,}$|^(?=.*[a-z])(?=.*[A-Z])[a-zA-Z]{6,}$|^(?=.*[a-z])(?=.*[0-9])(?=.*[_\W])[a-z0-9_\W]{6,}$|^(?=.*[a-z])(?=.*[0-9])[a-z0-9]{6,}$|^(?=.*[a-z])(?=.*[_\W])[a-z_\W]{6,}$|^(?=.*[A-Z])(?=.*[0-9])(?=.*[_\W])[A-Z0-9_\W]{6,}$|^(?=.*[A-Z])(?=.*[0-9])[A-Z0-9]{6,}$|^(?=.*[A-Z])(?=.*[_\W])[A-Z_\W]{6,}$|^(?=.*[0-9])(?=.*[_\W])[0-9_\W]{6,}$D类:长度6位及以上,至少包含大、小写字母,数字,特殊字符中的两种类型,且不能出现3位及以上的连续数字或字母;
^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[_\W])[a-zA-Z0-9_\W]{6,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9]{6,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])(?=.*[A-Z])(?=.*[_\W])[a-zA-Z_\W]{6,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])(?=.*[A-Z])[a-zA-Z]{6,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])(?=.*[0-9])(?=.*[_\W])[a-z0-9_\W]{6,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])(?=.*[0-9])[a-z0-9]{6,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])(?=.*[_\W])[a-z_\W]{6,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[A-Z])(?=.*[0-9])(?=.*[_\W])[A-Z0-9_\W]{6,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[A-Z])(?=.*[0-9])[A-Z0-9]{6,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[A-Z])(?=.*[_\W])[A-Z_\W]{6,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[0-9])(?=.*[_\W])[0-9_\W]{6,}$E类:长度8位及以上
^.{8,}$F类:长度8位及以上,且不能出现3位及以上的连续数字或字母;
^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[_\W])[a-zA-Z0-9_\W]{8,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9]{8,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])(?=.*[A-Z])(?=.*[_\W])[a-zA-Z_\W]{8,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])(?=.*[A-Z])[a-zA-Z]{8,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])(?=.*[0-9])(?=.*[_\W])[a-z0-9_\W]{8,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])(?=.*[0-9])[a-z0-9]{8,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])(?=.*[_\W])[a-z_\W]{8,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])[a-z]{8,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[A-Z])(?=.*[0-9])(?=.*[_\W])[A-Z0-9_\W]{8,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[A-Z])(?=.*[0-9])[A-Z0-9]{8,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[A-Z])(?=.*[_\W])[A-Z_\W]{8,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[A-Z])[A-Z]{8,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[0-9])(?=.*[_\W])[0-9_\W]{8,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[0-9])[0-9]{8,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[_\W])[_\W]{8,}$G类:长度8位及以上,至少包含大、小写字母,数字,特殊字符中的两种类型;
^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[_\W])[a-zA-Z0-9_\W]{8,}$|^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9]{8,}$|^(?=.*[a-z])(?=.*[A-Z])(?=.*[_\W])[a-zA-Z_\W]{8,}$|^(?=.*[a-z])(?=.*[A-Z])[a-zA-Z]{8,}$|^(?=.*[a-z])(?=.*[0-9])(?=.*[_\W])[a-z0-9_\W]{8,}$|^(?=.*[a-z])(?=.*[0-9])[a-z0-9]{8,}$|^(?=.*[a-z])(?=.*[_\W])[a-z_\W]{8,}$|^(?=.*[A-Z])(?=.*[0-9])(?=.*[_\W])[A-Z0-9_\W]{8,}$|^(?=.*[A-Z])(?=.*[0-9])[A-Z0-9]{8,}$|^(?=.*[A-Z])(?=.*[_\W])[A-Z_\W]{8,}$|^(?=.*[0-9])(?=.*[_\W])[0-9_\W]{8,}$H类:长度8位及以上,至少包含大、小写字母,数字,特殊字符中的两种类型,且不能出现3位及以上的连续数字或字母
^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[_\W])[a-zA-Z0-9_\W]{8,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9]{8,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])(?=.*[A-Z])(?=.*[_\W])[a-zA-Z_\W]{8,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])(?=.*[A-Z])[a-zA-Z]{8,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])(?=.*[0-9])(?=.*[_\W])[a-z0-9_\W]{8,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])(?=.*[0-9])[a-z0-9]{8,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])(?=.*[_\W])[a-z_\W]{8,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[A-Z])(?=.*[0-9])(?=.*[_\W])[A-Z0-9_\W]{8,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[A-Z])(?=.*[0-9])[A-Z0-9]{8,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[A-Z])(?=.*[_\W])[A-Z_\W]{8,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[0-9])(?=.*[_\W])[0-9_\W]{8,}$I类:长度8位及以上,至少包含大、小写字母,数字,特殊字符中的三种类型
^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[_\W])[a-zA-Z0-9_\W]{8,}$|^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9]{8,}$|^(?=.*[a-z])(?=.*[A-Z])(?=.*[_\W])[a-zA-Z_\W]{8,}$|^(?=.*[a-z])(?=.*[0-9])(?=.*[_\W])[a-z0-9_\W]{8,}$|^(?=.*[A-Z])(?=.*[0-9])(?=.*[_\W])[A-Z0-9_\W]{8,}$J类:长度8位及以上,至少包含大、小写字母,数字,特殊字符中的三种类型,且不能出现3位及以上的连续数字或字母
^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[_\W])[a-zA-Z0-9_\W]{8,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9]{8,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])(?=.*[A-Z])(?=.*[_\W])[a-zA-Z_\W]{8,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])(?=.*[0-9])(?=.*[_\W])[a-z0-9_\W]{8,}$|^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[A-Z])(?=.*[0-9])(?=.*[_\W])[A-Z0-9_\W]{8,}$K类:长度8位及以上,至少包含大、小写字母,数字,特殊字符四种类型
^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[_\W])[a-zA-Z0-9_\W]{8,}$L类:长度8位及以上,至少包含大、小写字母,数字,特殊字符四种类型,且不能出现3位及以上的连续数字或字母
^(?!.*(?:[0-9]{3}|[a-zA-Z]{3}|[a-z]{3}|[A-Z]{3}))(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[_\W])[a-zA-Z0-9_\W]{8,}$其他类型,能够参考其他博客地址,比如 正则表达式 - 密码格式验证大全
理解这一步时,如需大小写字母,数字,特殊字符校验的其他规则,能够在下方留言。我有工具能够生成。
总结
从实现思路看,总的来说,正则表达式校验密码适合结合实际项目边做边理解。先抓住核心思路,再逐步补上细节和边界处理,最后效果会更稳定,也更容易复用。
