基于正则表达式属性的客户端正则表达式验证失败

时间:2012-04-24 17:19:53

标签: jquery asp.net regex asp.net-mvc jquery-validate

在我的模型中,我为简单密码验证指定了正则表达式

[Required(ErrorMessage="Error")]
[RegularExpression("(?=.{6,})(?=.*\\d)|(?=.*\\W)", ErrorMessage= "Error")]
public string Password { get; set; }

正如预期的那样,这会产生一个html元素

<input class="textbox-regular" data-val="true" data-val-regex="Error" data-val-regex-pattern="(?=.{6,})(?=.*\d)|(?=.*\W)" data-val-required="Error" id="Password" name="Password" type="password" />

这是一个有效的JavaScript Regex,但密码永远不会匹配。这是JQuery验证器的限制吗?

THX

3 个答案:

答案 0 :(得分:1)

你的陈述包括三个积极的,前瞻性的断言。积极的,前瞻性断言不会返回找到的内容,因此我认为在没有返回任何内容时,您不会产生真值。这样的东西会产生你需要的东西吗?

((?=.*\W)|(?=.*\d)).{6,}

或者在你的字符串中:

"((?=.*\\W)|(?=.*\\d)).{6,}"

在这里,我断言至少有六个东西,它们必须包含非单词字符或数字。将返回六个或更多字符 ,因为我没有将其置于正向前瞻断言中。因为只有当里面的值与这些断言匹配时才返回该值,用户输入应该适当地通过检查。

Experiment with it here

有效的正则表达式并不意味着它将匹配您期望匹配的内容。究竟是什么,你希望匹配?

我的假设是你希望至少有六个字符与至少一个数字或至少一个非单词字符匹配?

答案 1 :(得分:1)

这很令人惊讶,因为它应该匹配几乎所有东西 验证器是否应该在匹配或失败时显示错误消息?

也许正则表达式应该匹配整个字符串。如果是这样,你可以尝试这个

"^(?:(?=.{6,})(?=.*\\d)|(?=.*\\W)).*$" 

看看会发生什么。

尝试在空字符串上使用^$,然后在长度为字符串的字符串上尝试。

答案 2 :(得分:1)

虽然有单个正则表达式可以达到我想要的效果,但我可以通过将其分解为3个验证来获得更好的用户体验,以便用户获得有关所需内容的特定消息。例如

[Required(ErrorMessage="Please enter a password")]
[StringLength(100, MinimumLength = 6, ErrorMessage = "Password must be at least 6 characters long")]
[RegularExpression("(.*\\d.*)|(.*[@#$%^&+=\\*].*)", ErrorMessage = "Password must contain a digit or special character")]