在asp.net中常用RegularExpressionValidator
来对密码的格式进行第一次验证。现有密码格式要求如下:
- 长度8-12位。
- 至少有一个字母。
- 至少有一个数字。
- 至少有一个特殊字符(非数字和字母的字符,例如:!@#$%等)。
在MSDN里找asp.net membership密码强度验证相关的东西,里面有对6位以上,至少一数字和特殊字符的正则表达式如下"(?=.{6,})(?=(.*\d){1,})(?=(.*\W){1,})
"。当我把短代码复制到RegularExpressionValidator
里面才发现,即使是符合的规定的密码也不能通过验证。
查看asp.net的js文件,找到调用RegularExpressionValidator
的函数:function RegularExpressionValidatorEvaluateIsValid(val) {
var value = ValidatorGetValue(val.controltovalidate);
if (ValidatorTrim(value).length == 0) {
return true;
}
var rx = new RegExp(val.validationexpression);
var matches = rx.exec(value);
return matches != null && value == matches[0];
}
(?=pattern)
就是所谓的“正向预查”,是个“非获取匹配”,也就是说如果不能匹配(?=pattern)
的话,matches的值是null,即使匹配了,matches[0](最后一次匹配的值)的值也是空("")。
根据以上,修改RegularExpressionValidator
中的ValidationExpression
为"(?=.{8,12})(?=.*[0-9]+)(?=.*[a-zA-Z]+)(?=.*\W+)(.*)
"
Comments