【问题标题】:RegularExpressionValidator always fails, but ValidationExpression works in testingRegularExpressionValidator 总是失败,但 ValidationExpression 在测试中有效
【发布时间】:2010-05-21 21:36:19
【问题描述】:

我找到了这个问题的答案,但它有点棘手,所以我想在这里分享它。

我有一个验证密码的正则表达式。它们应该是 7 到 60 个字符,至少有一个数字和一个字母字符。很标准。我使用了积极的前瞻((?= 运算符)来实现它:

(?=^.{7,60}$)(?=.*[0-9].*)(?=.*[a-zA-Z].*)

我在我的单元测试中使用 Regex.IsMatch() 检查了这个表达式,它运行良好。但是,当我在 RegularExpressionValidator 中使用它时,它总是失败。为什么?

【问题讨论】:

    标签: asp.net regex validation


    【解决方案1】:

    奇怪的是,我以前从未遇到过这种情况,但事实证明 RegularExpressionValidator 不使用 Regex.IsMatch 或 JavaScript 的 Regex.test() - 它检查捕获匹配完全等于完整测试值。下面是相关的JS代码:

    var rx = new RegExp(val.validationexpression);
    var matches = rx.exec(value);
    return (matches != null && value == matches[0]);
    

    因此,如果表达式都是前瞻(匹配位置,而不是实际文本),它将失败。这在仅部分匹配的表达式示例中更清楚,例如使用 \d{5},值“123456”将失败。它不仅仅是在你的表达式周围添加“^$”并执行 IsMatch。你的表情实际上必须捕捉。

    在我的情况下,解决方法是这个表达式:

    (?=^.{7,60}$)(?=.*[0-9].*).*[a-zA-Z].*
    

    【讨论】:

      【解决方案2】:

      你试过了吗

      (?=^.{7,60}$)(?=.*[0-9].*)(?=.*[a-zA-Z].*).+
      //                                        ^^
      

      ?正则表达式应该需要消耗一些东西。

      【讨论】:

      • 对,这就是问题所在。只是想写下我找到的答案。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      • 2020-08-29
      相关资源
      最近更新 更多