正则表达式以任何顺序匹配多个模式

时间:2011-01-25 08:28:26

标签: javascript .net regex

我正在验证ASP.NET MVC3应用程序中复杂性的密码。我目前的要求是它必须包含至少一个大写字母,一个小写字母,一个数字和不超过三个重复字符。我想对这些数字进行概括,并为非字母数字字符添加条件。

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

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

1 个答案:

答案 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注意!)。