MVC3正则表达式验证器 - “正则表达式中的语法错误”

时间:2011-11-03 21:53:38

标签: jquery regex asp.net-mvc-3 model-view-controller validation

我正在尝试向ViewModel

中的属性添加“RegularExpression”属性
[RegularExpression(@"^(?=^.{8,}$)(?=.*\d)(?=.*\W+)(?=.*[a-z])(?=.*[A-Z])(?i-msnx:(?!.*pass|.*password|.*word|.*god|.*\s))(?!^.*\n)^((.))+$.*$", ErrorMessage = "Password does not meet requirements.")]
public string NewPassword { get; set; }

验证发生时,我从Visual Studio得到以下异常:

Microsoft JScript runtime error: Syntax error in regular expression

这与我在定义成员资格提供程序时在web.config中定义的正则表达式相同:

passwordStrengthRegularExpression="^(?=^.{8,}$)(?=.*\d)(?=.*\W+)(?=.*[a-z])(?=.*[A-Z])(?i-msnx:(?!.*pass|.*password|.*word|.*god|.*\s))(?!^.*\n)^((.))+$.*$"

有人可以告诉我为什么在使用Model属性中的正则表达式时会出现此错误吗?

2 个答案:

答案 0 :(得分:4)

JScript是Microsoft的ECMAScript版本,与.NET相比,它支持极其有限的一组正则表达式功能。您最大的问题是它不支持像(?i:xyz)这样的内联修饰符。似乎也没有办法单独传递修饰符,就像你直接使用C#或JScript一样。如果你想排除不区分大小写的东西,你就有点紧张了。

同样要注意,像\d\W这样的字符类缩写在服务器(.NET)上的含义与在客户端(JScript)上的含义不同。如果您希望正则表达式在双方都能正常工作,您可能希望更具体。这是一个例子,为了清楚起见细分:

^
(?=\S{8,}$)           # eight or more non-whitespace characters
(?=.*[0-9])           # at least one digit
(?=.*[a-z])           # at least one lowercase letter
(?=.*[A-Z])           # at least one uppercase letter
(?=.*[^A-Za-z0-9])    # at least one non-letter, non-digit
(?!.*(?:pass|word|god|PASS|WORD|GOD))
.+$

如您所见,我只排除password等的全小写或全大写版本,这并不令人满意。如果您确实需要排除或要求整个单词不区分大小写,则可能必须使用其他类型的验证器。

答案 1 :(得分:1)

我认为你看到的问题是Javascript中不支持正则表达式的一部分。我对i-msnx:持怀疑态度,但我绝不是正则表达专家。我建议你将正则表达式切成两半,直到错误消失为止,这样你就可以缩小范围。

相关问题