Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 正则表达式以任意顺序匹配多个模式_Javascript_.net_Regex - Fatal编程技术网

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

Javascript 正则表达式以任意顺序匹配多个模式,javascript,.net,regex,Javascript,.net,Regex,我正在验证ASP.NET MVC3应用程序中的密码复杂性。我目前的要求是,它必须包含至少一个大写字母、一个小写字母、一个数字和不超过三个重复字符。不过,我想概括这些数字,并为非字母数字字符添加一个条件 目前,我只验证服务器端,所以我可以对每个条件使用一个正则表达式多次调用Regex.IsMatch。不过,我也希望能够验证客户端。因为不引人注目的jQuery验证只允许一个正则表达式,所以我需要将所有五个条件组合成一个模式 关于正则表达式我知道的不多,但最近我读了一些书。我可能遗漏了一些简单的东西,

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

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

关于正则表达式我知道的不多,但最近我读了一些书。我可能遗漏了一些简单的东西,但我找不到一种方法来将多个模式以a|will或它们的方式组合在一起。

您可以在一个正则表达式中使用多个模式(在.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的注意!).

我很难让这个模式在Rubular上工作:@dorkitude:1.9之前的Ruby正则表达式不支持Unicode属性,比如
\p{Lu}
\p{Ll}
。在一个像这样的.NET测试仪中试试:是的,Ruby不支持Unicode字符属性(
\p{Lu}
等等),至少Ruby 1.8是Rubular使用的。如果您使用
[A-Z]
(以及
\p{Ll}
[A-Z]
),它应该可以工作,但是您会丢失所有非ASCII字母。事实上,@Tim,JavaScript也不支持Unicode属性。由于这个问题的全部目的是创建一个在客户端工作的正则表达式,我认为您无论如何都必须切换到
[a-Z]
[a-Z]
。当您在服务器上运行它时,您应该指定
ECMAScript
模式,使
\d
\W
与在客户端上的工作方式相同。@Alan Moore:哦,我忽略了这一点-我看到了.NET标记并认为“太好了,可以使用Unicode!”。将编辑。