Angular TypeScript用正则做密码校验的连续顺序字符限制问题求解
满足要求的密码校验正则
直接给出最终可用的JavaScript版本正则:
const passwordReg = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!“#$%&'()*+,\-./:;<=>?@[\]^_`{|}~ ])(?!.*(.)\1{3})(?!.*(?:012|123|234|345|456|567|678|789|987|876|765|654|543|432|321|210|abc|bcd|cde|def|efg|fgh|ghi|hij|ijk|jkl|klm|lmn|mno|nop|opq|pqr|qrs|rst|stu|tuv|uvw|vwx|wxy|xyz|zyx|yxw|xwv|wvu|vut|uts|tsr|srq|rqp|qpo|pon|onm|nml|mlk|lkj|kji|jih|ihg|hgf|gfe|fed|edc|dcb|cba|ABC|BCD|CDE|DEF|EFG|FGH|GHI|HIJ|IJK|JKL|KLM|LMN|MNO|NOP|OPQ|PQR|QRS|RST|STU|TUV|UVW|VWX|WXY|XYZ|ZYX|YXW|XWV|WVU|VUT|UTS|TSR|SRQ|RQP|QPO|PON|ONM|NML|MLK|LKJ|KJI|JIH|IHG|HGF|GFE|FED|EDC|DCB|CBA)).{8,256}$/;
规则拆分说明
正向校验(必须满足的条件)
(?=.*[a-z]):至少包含1个小写字母(?=.*[A-Z]):至少包含1个大写字母(?=.*\d):至少包含1个数字(?=.*[!“#$%&'()*+,\-./:;<=>?@[\]^_{|}~ ])`:至少包含1个指定范围内的特殊字符,已处理连字符的转义问题避免范围识别错误
负向校验(禁止出现的情况)
(?!.*(.)\1{3}):禁止出现4个及以上连续重复的字符,符合最多3个连续重复的要求- 负向预查中的长串连续序列:覆盖大小写字母、数字的正序/倒序4位连续场景,
1234、abcd、4321、DCBA这类连续顺序的字符都会被拦截,满足最多3个连续顺序字符的要求
长度限制
.{8,256}限定密码长度为8~256位,和原有规则保持一致
原有正则失效原因
你原来写的(?!.*(.{3}).*\2.*)逻辑是禁止重复出现任意3个字符的子串,和「连续顺序字符」的要求完全不匹配,所以无法实现对应的校验。
如果需要额外拦截键盘顺序类的连续字符(比如qwer、asdf),直接把对应的子串加到负向预查的序列列表里即可。
内容的提问来源于stack exchange,提问作者Anjali
相关产品推荐
相关产品推荐

