Regex 模型验证正则表达式从不匹配
我有以下正则表达式注释:Regex 模型验证正则表达式从不匹配,regex,asp.net-mvc-3,razor,Regex,Asp.net Mvc 3,Razor,我有以下正则表达式注释: [RegularExpression(@"(?=.{6,})(?=(.*\d){1,})(?=(.*\W){1,})", ErrorMessage = "Password is not strong enough!")] public string Password { get; set; } 这是我在MembershipProvider中使用的正则表达式的复制/粘贴,我可以使用“admin1*”之类的密码进行注册。我也在RegexHero中测试了这个
[RegularExpression(@"(?=.{6,})(?=(.*\d){1,})(?=(.*\W){1,})", ErrorMessage = "Password is not strong enough!")]
public string Password { get; set; }
这是我在MembershipProvider中使用的正则表达式的复制/粘贴,我可以使用“admin1*”之类的密码进行注册。我也在RegexHero中测试了这个正则表达式,它确实有效
当我将表单发回控制器时,该值也存在,但模型从未验证
有人知道这可能是什么吗
提前感谢,
编辑:
我使用一个正则表达式进行了测试,该正则表达式验证只包含5个数字的字符串,当我输入12345时确实会验证,而使用其他字符串(如“abc”)则失败。所以regex机制似乎起作用了 您的正则表达式很好,问题在于
IsValid
方法如何在RegularExpressionAttriubte
中实现。因为只有当一个输入匹配从一开始的整个模式时,它才是有效的
如Resharper所见,方法的摘录是有效的
:
public override bool IsValid(object value)
{
//...
Match match = this.Regex.Match(input);
if (match.Success && match.Index == 0)
return match.Length == input.Length;
else
return false;
}
您的模式@(?=.{6,})(?=(.*\d){1,})(?=(.*\W){1,})
匹配输入admin1*
somatch.Success
将为true
但由于使用了match.Legth
将始终为0
,而match.Length==input.Length
的计算结果总是false
它在MembershipProvider
中工作,因为它只检查match.Success
,而不关心匹配的长度
我认为有两种可能的解决办法:
RegularExpressionAttriubte
(或从内置表达式派生),其中在有效的方法中,您只检查匹配。成功
+1.看起来您可以简单地将所有
(捕获)
组替换为(?:非捕获)
组来解决这个问题。因此正则表达式将变成(?=。{6,})(?=(?:.*\d){1,})(?=(?:..\W){1,})
。这对我很有效。我在这里添加了完整的代码示例: