我的客户要求他们系统上的密码必须遵循一组特定的验证规则,而且我很难想出一个“好的”正则表达式。
我给出的规则是......
当我按下更多时,“特殊字符”几乎就是其他所有内容(包括空格)。
我可以使用以下内容轻松检查所有四个实例中的至少一个实例...
^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?\d)(?=.*?[^a-zA-Z0-9]).{8,}$
以下作品,但它太可怕而且凌乱......
^((?=.*?[A-Z])(?=.*?[a-z])(?=.*?\d)|(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[^a-zA-Z0-9])|(?=.*?[A-Z])(?=.*?\d)(?=.*?[^a-zA-Z0-9])|(?=.*?[a-z])(?=.*?\d)(?=.*?[^a-zA-Z0-9])).{8,}$
所以你不必自己解决,上面是检查(1,2,3|1,2,4|1,3,4|2,3,4)
这4个组的4种可能组合(其中数字与规则集中的“类型”有关) )。
是否有“更好”,更清洁或更简单的方法?
(请注意,这将在ASP.NET网站的<asp:RegularExpressionValidator>
控件中使用,因此需要成为.NET和javascript的有效正则表达式。)
答案 0 :(得分:15)
这不是一个更好的解决方案,但您可以将[^a-zA-Z0-9]
缩减为[\W_]
,因为单词字符是所有字母,数字和下划线字符。在单个正则表达式中尝试执行此操作时,我认为您不能避免交替。我认为你几乎拥有最好的解决方案。
一个轻微的优化是{{1}}〜&gt; \d*[a-z]\w_*|\d*[A-Z]\w_*
,所以我可以删除其中一个交替集。如果您只允许4个中的3个,那么这将无法正常工作,但由于\d*[a-zA-Z]\w_*
被隐式允许,因此无效。
\d*[A-Z][a-z]\w_*
扩展版本:
(?=.{8,})((?=.*\d)(?=.*[a-z])(?=.*[A-Z])|(?=.*\d)(?=.*[a-zA-Z])(?=.*[\W_])|(?=.*[a-z])(?=.*[A-Z])(?=.*[\W_])).*
由于OP指定的第四个条件,此正则表达式将匹配甚至不可打印的字符,例如新行。如果这是不可接受的,那么修改包含(?=.{8,})(
(?=.*\d)(?=.*[a-z])(?=.*[A-Z])|
(?=.*\d)(?=.*[a-zA-Z])(?=.*[\W_])|
(?=.*[a-z])(?=.*[A-Z])(?=.*[\W_])
).*
的集合以允许更具体的特殊字符集。
答案 1 :(得分:2)
我想用这个改进已接受的解决方案
^(?=.{8,})(
(?=.*[^a-zA-Z\s])(?=.*[a-z])(?=.*[A-Z])|
(?=.*[^a-zA-Z0-9\s])(?=.*\d)(?=.*[a-zA-Z])
).*$
答案 2 :(得分:0)
密码必须满足以下4个复杂度规则中的至少3个,
[至少1个大写字母(A-Z)至少1个小写字母(a-z)至少1个数字(0-9)至少1个特殊字符-不要忘记将空格也视为特殊字符]
至少10个字符
最多128个字符
连续不超过2个相同字符(例如,不允许使用111个字符)
'^(?!.(.)\1{2}) ((?=.[a-z])(?=.[A-Z])(?=.[0-9])|(?=.[a-z])(?=.[A-Z])(?=.[^a-zA-Z0-9])|(?=.[A-Z])(?=.[0-9])(?=.[^a-zA-Z0-9])|(?=.[a-z])(?=.[0-9])(?=.*[^a-zA-Z0-9])).{10,127}$'
(?!.*(.)\1{2})
(?=.[a-z])(?=.[A-Z])(?=.*[0-9])
(?=.[a-z])(?=.[A-Z])(?=.*[^a-zA-Z0-9])
(?=.[A-Z])(?=.[0-9])(?=.*[^a-zA-Z0-9])
(?=.[a-z])(?=.[0-9])(?=.*[^a-zA-Z0-9])
。{10,127}