我正在验证ASP.NET MVC3应用程序中复杂性的密码。我目前的要求是它必须包含至少一个大写字母,一个小写字母,一个数字和不超过三个重复字符。我想对这些数字进行概括,并为非字母数字字符添加条件。
目前,我只验证服务器端,因此我可以使用一个正则表达式为每个条件多次调用Regex.IsMatch。我希望能够验证客户端。因为不显眼的jQuery验证只允许一个正则表达式,我需要将所有五个条件组合成一个模式。
我对正则表达式的了解不多,但最近我一直在做一些阅读。我可能会遗漏一些简单的东西,但我无法找到一种方式将多个模式组合在一起或者他们。
答案 0 :(得分:8)
您可以在单个正则表达式中使用多个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注意!)。