【问题标题】:Client-side regex validation based on Regular Expression attribute fails基于正则表达式属性的客户端正则表达式验证失败
【发布时间】:2012-04-24 17:19:53
【问题描述】:

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

[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 正则表达式,但密码永远不会匹配。这是 JQuery 验证器的限制吗?

谢谢

【问题讨论】:

  • 您在这里找到答案了吗?请务必提及或接受以下答案之一。

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


【解决方案1】:

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

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

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

看看会发生什么。

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

【讨论】:

  • 是的,感谢当我包含 ^$ 和 (?:) 时起作用。我不确定后者是做什么的。无论如何,我找到了一个更好的解决方案,我也在下面发布。
【解决方案2】:

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

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

或者在你的字符串中:

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

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

Experiment with it here.

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

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

【讨论】:

  • 断言单独匹配但不返回匹配变量中的值。 ^ 将匹配但不会返回任何内容。有些实现的 api 要求默认匹配整个字符串,有些 api 只是一个子字符串。
  • @sln;啊。那么,看起来我对 OP 问题的假设是不正确的。我应该删除这个答案以免混淆其他人吗?
  • 嗯,这对我来说很有意义,THX
【解决方案3】:

虽然有单个正则表达式可以满足我的需求,但我可以通过将其分解为 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")]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 2020-11-21
    • 2018-04-24
    相关资源
    最近更新 更多