3

我有以下正则表达式注释:

    [RegularExpression(@"(?=.{6,})(?=(.*\d){1,})(?=(.*\W){1,})", ErrorMessage = "Password is not strong enough!")]
    public string Password { get; set; }

这是我在 MembershipProvider 中使用的正则表达式的复制/粘贴,它可以在其中工作,因为我可以使用“admin1 *”之类的密码进行注册。我也在 RegexHero 中测试了这个正则表达式,它确实有效。

当我将表单回传到控制器时,该值也存在,但模型永远不会验证。

任何人都知道这可能是什么?

提前致谢,

编辑:

我测试了一个正则表达式,它验证只包含 5 个数字的字符串,当我输入 12345 时它确实验证了,而其他字符串(如“abc”)则失败了。所以正则表达式机制似乎工作..

4

1 回答 1

3

您的正则表达式很好,问题在于如何IsValidRegularExpressionAttriubte. 因为输入只有在与开头的整个模式匹配时才有效。

IsValidResharper 看到的方法摘录:

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,})与输入相匹配,但由于使用了Grouping 构造,因此admin1*match.Success永远是并且评估为永远。truematch.Legth0match.Length == input.Lengthfalse

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

我看到两种可能的解决方案:

  1. 重写您的正则表达式模式以不使用分组构造(我不擅长正则表达式,所以我无法在这里提供帮助)
  2. 创建您自己的RegularExpressionAttriubte(或从内置的派生)在IsValid您只检查的方法中match.Success
于 2012-08-03T06:02:25.790 回答