密码上的正则表达式 - 忽略匹配顺序

时间:2014-03-12 17:24:49

标签: .net regex asp.net-mvc

在视图模型中,我有以下正则表达式属性,但它不起作用。

[RegularExpression(@"(?=[A-Z]+)(?=[a-z]+)(?=[0-9]+)", ErrorMessage = "Password must contain digits as well as lower and upper case letters.")]

因此,密码字符串必须包含至少一个小写字母,一个大写字母和至少一个数字。

我看着 Regular Expressions: Is there an AND operator? 但是我无法使它发挥作用。

感谢任何帮助。感谢。

2 个答案:

答案 0 :(得分:1)

首先,在您的前瞻子句中需要.*才能使这些字符位于匹配字符串中的任何位置。没有它 - 所有这些角色都必须在你的字符串的开头。

其次,您需要实际拥有一个捕获子句,否则您将获得一个空匹配 - 这将被视为无效(为什么?见下文)。所以

(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[A-Za-z0-9]* 

会为您提供完整的匹配密码。你也可以在这里检查密码长度 -

(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[A-Za-z0-9]{8,} 

密码长度必须大于8个字符。


至于为什么需要正则表达式捕获的值,RegexValidationAttribute' IsValid(object value)方法使用以下逻辑语句返回,如果输入的值根据正则表达式有效。 (其中m是给定值上给定模式的MatchstringValue是给定值)

return (m.Success && m.Index == 0 && m.Length == stringValue.Length);

View the source yourself

考虑您是否具有.{3,8}的验证RegEx - 意味着长度为3到8个字符的任何字符串。您尝试验证值123456789。正则表达式匹配此字符串! 12345678长度在3到8个字符之间!实际上,23456789也是如此。而且123就此而言。仅检查匹配是不够的,您必须进一步检查整个值是否匹配。

答案 1 :(得分:0)

在您的环视中使用.*以符合您的条件。

(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])