我需要创建一个正则表达式来验证我的MVC模型中的强密码。以下是我需要应用的规则:
!@#$%&/=?_.
)这是我到目前为止所尝试的内容:
[DataType(DataType.Password)]
[RegularExpression("([a-z]|[A-Z]|[0-9]|[\\W]){4}[a-zA-Z0-9\\W]{3,11}", ErrorMessage = "Invalid password format")]
public string Password { get; set; }
答案 0 :(得分:2)
创建一个可以按任意顺序查找任意数量的不同类型的字符类的正则表达式有点具有挑战性,因为只要您匹配一个字符,它就已经被捕获,您无法备份它。但是,.NET正则表达式引擎支持超前表达式。因此,您可以检查以确保字符串包含某些内容而不实际捕获任何字符串。例如,假设您要查找包含至少一个字母“J”的任何10个字符的长字符串。您可以使用超前表达式轻松完成此操作,如下所示:
(?=.*J).{10}
(?=)
构造声明了一个先行模式。它寻找的模式是.*J
,这意味着,从当前位置开始,可以有任意数量的任何字符,后跟字母“J”。如果有任何事情发生在J之后,那很好,它仍然会匹配。但是,由于它是预测,实际上没有捕获到这些字符,因此模式的.{10}
捕获部分从原始位置拾取并从那里匹配。由于前瞻不会移动位置,你可以将它们中的多个放在一行而不会有任何后果,所以你可以这样做:
^(?=.*[A-Z])(?=.*\d)(?=.*[a-z])(?=.*\W).{7,15}$
至于只应用四个字符类规则中的三个,我能想到的唯一方法是列出所有组合(例如,对于三个规则A,B和C中的两个,你可以匹配AB | AC | BC)。例如,如果你只关心三个中的两个(例如大写,小写和数字),你可以像这样构建你的前瞻:
(?:(?=.*[A-Z])(?=.*\d)|(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[a-z]))
只需要将选项列表更长一段时间就可以支持四种选择......
答案 1 :(得分:2)
Steven的答案的发展是测试类型的所有可能组合:
^((?=.*[A-Z])(?=.*\d)(?=.*[a-z])|(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%&\/=?_.-])|(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%&\/=?_.-])|(?=.*\d)(?=.*[a-z])(?=.*[!@#$%&\/=?_.-])).{7,15}$
还使用给定的特殊字符。
以更易阅读的形式
^((?=.*[A-Z])(?=.*\d)(?=.*[a-z])|
(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%&\/=?_.-])|
(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%&\/=?_.-])|
(?=.*\d)(?=.*[a-z])(?=.*[!@#$%&\/=?_.-])).{7,15}$
测试类型的四种组合中的任何一种,并确保其中有7-14种。
此致