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*
so
match.Success
将为
true
但由于使用了
match.Legth
将始终为
0
,而
match.Length==input.Length
的计算结果总是
false

它在
MembershipProvider
中工作,因为它只检查
match.Success
,而不关心匹配的长度

我认为有两种可能的解决办法:

  • 重写你的正则表达式模式,不要使用分组结构(我不擅长正则表达式,所以我在这里无能为力)
  • 创建自己的
    RegularExpressionAttriubte
    (或从内置表达式派生),其中在
    有效的方法中,您只检查
    匹配。成功

  • +1.看起来您可以简单地将所有
    (捕获)
    组替换为
    (?:非捕获)
    组来解决这个问题。因此正则表达式将变成
    (?=。{6,})(?=(?:.*\d){1,})(?=(?:..\W){1,})
    。这对我很有效。我在这里添加了完整的代码示例: