如何基于指定约束编写仅支持核心语法的密码校验正则表达式
基础字符集定义
首先统一约定后续用到的字符集合:
- 小写字母集
L = {a,b,c,...,z} - 大写字母集
U = {A,B,C,...,Z} - 数字集
N = {0,1,2,...,9} - 合法特殊字符集
S = {@,$,#,%,&} - 合法首字符集
A = L ∪ U ∪ N,对应正则写法为(L|U|N)
原有写法问题说明
你当前写的正则存在三个明显问题:
- 强制了字符类型的出现顺序,没有覆盖小写、大写、数字、特殊字符的任意排列场景,会漏过大量合法密码
- 完全没有实现「禁止3位及以上相同连续数字」的约束
- 没有限制整体只能出现指定范围内的字符
符合要求的正则实现
由于仅能使用核心正则(不支持断言),需要通过排列组合覆盖所有必要字符的出现顺序,同时限制数字的连续出现次数:
- 首先定义合法字符单元,保证不会出现3位连续相同数字:
// 非数字字符无连续限制,每个数字最多连续出现2次 E = (L|U|S) | (0|00)|(1|11)|(2|22)|(3|33)|(4|44)|(5|55)|(6|66)|(7|77)|(8|88)|(9|99)
- 按首字符类型分三类场景,覆盖所有必要字符的排列组合,最终正则如下:
# 场景1:首字符为小写字母,后续需包含大写、数字、特殊字符各至少1个 L E* ( E* U E* N E* S E* | E* U E* S E* N E* | E* N E* U E* S E* | E* N E* S E* U E* | E* S E* U E* N E* | E* S E* N E* U E* ) | # 场景2:首字符为大写字母,后续需包含小写、数字、特殊字符各至少1个 U E* ( E* L E* N E* S E* | E* L E* S E* N E* | E* N E* L E* S E* | E* N E* S E* L E* | E* S E* L E* N E* | E* S E* N E* L E* ) | # 场景3:首字符为数字,后续需包含小写、大写、特殊字符各至少1个 N E* ( E* L E* U E* S E* | E* L E* S E* U E* | E* U E* L E* S E* | E* U E* S E* L E* | E* S E* L E* U E* | E* S E* U E* L E* )
如果需要完全符合核心正则语法,只需把所有缩写的集合(L/U/S等)替换为对应字符用|连接的形式即可。
内容的提问来源于stack exchange,提问作者Huda Iftikar
相关产品推荐
相关产品推荐

