我正在尝试使用正则表达式来检查MVC4数据注释的密码复杂性。我从一个简单的正则表达式开始检查长度,但以下不适用于任何长度的字符串。我犯了什么错误?
[RegularExpression(@"^(?=.{8,})$", ErrorMessage = "Password not strong enough")]
[Required]
[DataType(DataType.Password)]
public string Password { get; set; }
答案 0 :(得分:2)
就你所尝试的简单正则表达式而言,你可以使用:
^.{8,}$
您不希望正向查找(?=)。请参阅我的描述为什么最后会出现这种情况。
对于简单的字符串长度检查,如果您使用的是asp.net 4.0,则可以使用StringLength length属性:
[StringLength(8, MinimumLength=1)]
(注意:正如Tommy在评论中指出的那样,你需要一个正则表达式来进行完整的密码检查)。如果您正在寻找更复杂的密码正则表达式,那么我建议您查看tommy的答案并开始here和here。
为什么(?=)不起作用
^
- 匹配字符串的开头。.{8,}
- 然后向前看,看看是否至少有8个字符。 (记住正向查找不会改变测试位置,所以这仍然是字符串的开头)。另一个例子是.+(?=.{8,})$
将失败,因为字符串中没有这样的位置,后跟8个字符,而测试位置的下一个字符是字符串$
的结尾。
最后一个例子是^.(?=.{7,})
,它将匹配(至少)8个字符串的第一个字符。这是因为只有第一个字符以开头^
答案 1 :(得分:2)
鉴于你想要根据你的开头句子验证长度以及其他一些密码复杂性规则,我建议你在互联网上查看一些关于“密码复杂性正则表达式”的Regex blogs。例如,如果您想确保密码长度至少为8-20个字符,并且包含一个大写字母和一个小写字母以及一个数字,那么您将使用以下正则表达式
((?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,20})
基本上分解为,我需要至少8个(不超过20个)字符,至少一个必须是数字,至少一个必须是a-z且至少一个必须是A-Z。您可以将其他示例和位组合在一起。
为了测试您的正则表达式,我建议使用http://regexhero.net/tester/等正则表达式测试网站。结合MSDN,您应该能够制作一些非常漂亮的表达。