2011-01-25 212 views
3

我在验证ASP.NET MVC3应用程序的复杂性密码。我目前的要求是它必须至少包含一个大写字母,一个小写字母,一个数字和不超过三个重复字符。我想尽可能概括这些数字,并且为非字母数字字符添加条件。正则表达式以任意顺序匹配多个模式

目前,我仅在服务器端进行验证,所以我可以使用一个正则表达式针对每个条件多次调用Regex.IsMatch。尽管如此,我也希望能够验证客户端。因为不显眼的jQuery验证只会允许一个正则表达式,所以我需要将所有五个条件合并成一个模式。

对于正则表达式,我不太了解,但最近我一直在阅读。我可能会遗漏一些简单的东西,但是我找不到一种方法将多个模式结合在一起将或他们。

回答

9

您可以在一个单一的正则表达式与几个lookahead assertions做到这一点(在.net中):如果所有条件都满足

^(?=.*\p{Lu})(?:.*\p{Ll})(?=.*\d)(?=.*\W)(?!.*(.).*\1.*\1) 

将匹配。

^     # Match the start of the string 
(?=.*\p{Lu})  # True if there is at least one uppercase letter ahead 
(?=.*\p{Ll})  # True if there is at least one lowercase letter ahead 
(?=.*\d)   # True if there is at least one digit ahead 
(?=.*\W)   # True if there is at least one non-alnum character ahead 
(?!.*(.).*\1.*\1) # True if there is no character repeated twice ahead 

注意,比赛是不会消耗字符串的任何字符 - 如果你想匹配操作返回你对匹配的字符串,在正则表达式的末尾添加.*

在JavaScript中,您不能使用Unicode字符属性。因此,您可以使用

^(?=.*[A-Z])(?:.*[a-z])(?=.*\d)(?=.*\W)(?!.*(.).*\1.*\1) 

这当然只会使用ASCII字母进行验证。如果这对你没问题,没问题。你可以去扩充像[A-ZÄÖÜÀÈÌÒÙÁÉÍÓÚ]等字符类,但你可能永远不会完成这个。在服务器端,如果你想验证产生相同的结果,你必须指定RegexOptions.ECMAScript,所以.NET正则表达式引擎的行为就像JavaScript引擎(感谢Alan Moore注意!)。

+0

我很难让这个模式在Rubular上工作:http://rubular.com/r/008s20R3fa – 2011-01-25 08:54:50