2014-03-12 59 views
0

在视图模型中,我有以下正则表达式属性,但它不起作用。密码正则表达式 - 忽略匹配顺序

[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? 但我无法让它工作。

任何帮助表示赞赏。谢谢。

回答

1

首先,你需要.*您先行条款内,使这些字符是在匹配的字符串的任何位置。没有这些 - 所有这些角色都必须在你的字符串开头。第二,你需要实际上有一个捕获子句,否则你会得到一个空匹配 - 这将被视为无效(为什么?见下文)。所以

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

会给你匹配密码的全部。你也可以在这里查看密码长度 -

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

会使密码长度大于8个字符。


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

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

View the source yourself

考虑,如果你具有.{3,8}的验证正则表达式 - 这意味着三年之间的任何字符串八个字符的长度。您尝试验证值123456789。正则表达式匹配这个字符串! 12345678长度在三到八个字符之间!其实,23456789也是。和123,就此而言。只检查比赛是不够的,你必须进一步检查整个值是否匹配。

+0

谢谢你的字符串长度提示呢! – erdinger

+1

乐意帮忙。如果不明确,该正则表达式的[A-Za-z0-9]部分假定这些是您的密码数据唯一有效的字符集。你可能需要适当调整它,或者将它改为'。{8,}',让它接受任何长度为8+的字符(仍然是三个前提条件匹配的地方)。 –

0

在您的环视中使用.*以符合您的情况。

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

不应该附加“。{3,}”(或最小字符长度的类似内容)以实际创建匹配吗?这些前瞻只是断言条件。我猜想最终不需要密码字符串并不重要。 – tenub

+0

@tenub它不需要。因为它会在字符串中寻找至少一个'A,a,0'。所以必须有三个字符。 –

+0

我在regexhero.net/tester/上试过这个正则表达式,它说有一个匹配“Password1”的例子,但它在我的应用程序中不起作用。 – erdinger