我要求密码必须包含一个大写,小写,数字和特殊字符。密码长度应为6到10个字符。在此基础上我写了一个正则表达式,但看起来很冗长。我可以为它应用一些优化逻辑吗?
\A(?=[\w@=]{6,10}\z)(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[@=])
另一方面,我可以在正则表达式中使用逻辑AND类型的概念吗?请帮忙
答案 0 :(得分:3)
你可以使用对比和锚的原理:
(?=[^A-Z]*[A-Z]) # one UPPERCASE
(?=[^a-z]*[a-z]) # one lowercase
(?=\D*\d) # one digit
(?=[^!"§$%]*[!"§$%]) # one symbol
^.{6,10}$ # 6-10 characters
如您所见,它遵循规则
(?=[not this]{zero or more times}[this]{once})
并且可能比.*
快几倍
但是对于n个要求,你需要n-1个前瞻和一个匹配机制
请参阅a demo on regex101.com。