如何在现有密码验证Regex中实现禁止重复单词/模式的校验?
密码正则表达式添加重复模式校验的可行性解答
你的现有正则已经满足了除「禁止重复单词或模式」外的所有密码规则,可以在当前正则中添加相关校验逻辑,但需要根据你对「重复模式」的定义调整,以下分两种场景说明:
1. 禁止连续重复的子串(如xyzxyz、123123)
这种情况可直接在现有正则的负向前瞻中添加(?!.*(.{2,})\1),用来匹配并排除任何长度≥2的连续重复子串。
整合后的正则为:
(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[.,!@#$%^+=_])(?!.*(.)\1)(?!.*(.{2,})\1).{8,20}$
- 解释:
(?!.*(.{2,})\1)会检查字符串中是否存在长度≥2的子串连续重复出现(比如xyzxyz里的xyz重复),一旦匹配到就判定密码无效。
2. 禁止非连续的重复单词/子串(如ProPersonPro、a1bca1bc)
如果要覆盖这种间隔重复的场景,需调整负向前瞻为(?!.*(.{2,}).*\1),用来排除任何长度≥2的子串在字符串中出现两次及以上(不管中间是否有其他字符)。
整合后的正则为:
(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[.,!@#$%^+=_])(?!.*(.)\1)(?!.*(.{2,}).*\1).{8,20}$
- 注意:这个规则会大幅增加正则的匹配开销,因为需要遍历所有可能的子串组合,对于长度接近20的密码,性能可能会有明显下降。
额外说明
你的现有正则已经通过(?!.*(.)\1)禁止了单个字符重复(比如AA、11),所以上面的规则只针对长度≥2的重复子串/单词。如果你的「重复模式」还包含其他特殊情况(比如固定长度的重复),可以进一步调整子串的长度范围(比如把.{2,}改成.{3,}来只禁止长度≥3的重复模式)。
内容的提问来源于stack exchange,提问作者programmerboy
相关产品推荐
相关产品推荐

