我找到了答案,但这有点儿了,所以我想在这里分享。
我有一个验证密码的正则表达式。它们应为7到60个字符,并且至少包含一个数字和一个字母字符。很标准。我使用了正向前瞻((?= 运算符)来实现它:
(?=^.{7,60}$)(?=.*[0-9].*)(?=.*[a-zA-Z].*)
我在单元测试中使用 Regex.IsMatch()检查了这个表达式,它运行正常。但是,当我在RegularExpressionValidator中使用它时,它总是失败。为什么呢?
答案 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].*).+
// ^^
?正则表达式应该需要消费。