正则表达式找到4个条件中的3个

时间:2014-03-05 17:26:03

标签: regex passwords

我的客户要求他们系统上的密码必须遵循一组特定的验证规则,而且我很难想出一个“好的”正则表达式。

我给出的规则是......

  • 最少8个字符
  • 允许任何字符
  • 必须至少有一个来自四个以下字符类型中的三个的实例...
    1. 大写字符
    2. 小写字符
    3. 数字数字
    4. “特殊字符”

当我按下更多时,“特殊字符”几乎就是其他所有内容(包括空格)。

我可以使用以下内容轻松检查所有四个实例中的至少一个实例...

^(?=.*?[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的有效正则表达式。)

3 个答案:

答案 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}