RegularExpressionValidator始终失败,但ValidationExpression在测试中起作用

时间:2010-05-21 21:36:20

标签: asp.net regex validation

我找到了答案,但这有点儿了,所以我想在这里分享。

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

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

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

2 个答案:

答案 0 :(得分:4)

奇怪的是我之前从未遇到过这种情况,但事实证明,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].*

答案 1 :(得分:1)

你试过吗

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

?正则表达式应该需要消费。