2012-08-02 99 views
3

我有以下的正則表達式註釋:模型驗證的正則表達式永遠不匹配

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

這是從我的正則表達式複製/粘貼我在我的MembershipProvider,它的作品,因爲我可以像「ADMIN1密碼註冊使用*」。我在RegexHero中測試了這個正則表達式,它確實有效。

當我將表單發回控制器時,該值也存在,但該模型從不驗證。

任何人都有線索,這可能是什麼?

由於提前,

編輯:

我與驗證只含有5個號碼串的正則表達式進行測試,這並驗證我當輸入12345,並且未能與其他字符串如「ABC」。所以正則表達式似乎工作..

回答

3

您的正則表達式很好,問題是IsValid方法如何實現在RegularExpressionAttriubte。因爲輸入只有在匹配整個模式時纔有效。

通過ReSharper的所看到的IsValid方法的摘錄:

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*所以match.Successtrue但由於Grouping constructsmatch.Legth的使用將是永遠0match.Length == input.Length評估始終爲false

它在MembershipProvider工作,因爲它只檢查match.Success,並不關心比賽的長度。

我看到了兩個可能的解決方案:

  1. 重寫你的正則表達式模式不使用分組構造(我不擅長的正則表達式,所以我不能在這裏幫助)
  2. 創建您自己的RegularExpressionAttriubte(或派生內置一個)在IsValid方法中,您只能檢查match.Success
+1

+1。看起來你可以簡單地用'(?:non-capturing)'組代替所有'(捕獲)'組來解決這個問題。所以正則表達式會變成(?=。{6,})(?=(?:。* \ d){1,})(?=(?:。* \ W){1,})'。 – 2012-08-07 13:52:27

+0

這對我有用。我在這裏添加了我的完整代碼示例:https://gist.github.com/4198259 – 2012-12-03 21:30:43