我正在尝试向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属性中的正则表达式时会出现此错误吗?
答案 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))
.+$
如您所见,我只排除pass
,word
等的全小写或全大写版本,这并不令人满意。如果您确实需要排除或要求整个单词不区分大小写,则可能必须使用其他类型的验证器。
答案 1 :(得分:1)
我认为你看到的问题是Javascript中不支持正则表达式的一部分。我对i-msnx:
持怀疑态度,但我绝不是正则表达专家。我建议你将正则表达式切成两半,直到错误消失为止,这样你就可以缩小范围。