2011-10-12 57 views
1

我必須驗證應該包含小時編號的字符串(例如00到23)。.NET ComponentModel.DataAnnotations與RegularExpression屬性問題

我因此設置像一個註解:

[RegularExpression("[01]?[0-9]|2[0-3]", ErrorMessage = "Error")] 
public string JobStartHour {...} 

不幸的是,這個正則表達式的投入不匹配,從20到23,因爲它是應該做的(恕我直言)

這不是RegularExpression屬性使用普通的舊的Regex.IsMatch?

Regex.IsMatch("22", "[01]?[0-9]|2[0-3]") 

返回true ...

編輯:我知道,使用字符串是不是最好的辦法,以存儲號碼,不過,這個正則表達式的問題是煩人。

+1

我已更新我的答案,以便它與「0」或「00」一起使用。希望這可以解決你的問題。 –

回答

0

不知道爲什麼這個表達式是不正確的解釋,但一個解決方案是實現一個CustomValidation,這是非常方便的。

[CustomValidation(typeof(MyCustomValidation), "Validate24Hour")] 
    public string JobStartHour {...} 

... 

    public class MyCustomValidation 
    { 
     public static ValidationResult Validate24Hour(string candidate) 
     { 
      bool isValid = false; 
     ... 
      if (isValid) 
      { 
       return ValidationResult.Success; 
      } 
      else 
      { 
       return new ValidationResult("Error"); 
      } 
     } 
    } 
0

試試這個:

[RegularExpression("2[0-3]|[01]?[0-9]", ErrorMessage = "Error")] 
public string JobStartHour {...} 
2

此模式將起作用。我碰到了same thing。它與使用parens來正確建立分組有關。如果RegExAttribute無法解決問題,它似乎只是在管道符號處退出。

這是一個單元測試。

[TestMethod] 
    public void CheckHours() 
    { 
     var pattern = "([0-1][0-9])|(2[0-3])|([0-9])"; 
     int cnt = 0; 

     var hours = new string[] 
     { "1","2","3","4","5","6","7","8","9", 
      "01","02","03","04","05","06","07","08","09", 
      "10","11","12","13","14","15","16","17","18","19", 
      "20","21","22","23" }; 

     var attribute = new RegularExpressionAttribute(pattern); 
     bool isMatchOk = false; 
     bool isAttrOk = false; 

     foreach (var hour in hours) 
     { 
     isMatchOk = System.Text.RegularExpressions.Regex.IsMatch(hour, pattern); 
     isAttrOk = attribute.IsValid(hour); 

     if (isMatchOk & isAttrOk) 
     { cnt += 1; } 
     else 
     { Debug.WriteLine(hour + "/" 
      + isMatchOk.ToString() + "/" 
      + isAttrOk.ToString()); } 
     } 

     Assert.AreEqual(32, cnt); 
    } 
0

您必須將|分組才能正常工作。

我成功嘗試,它應該正好您正則表達式,但分組和有限的啓動&結束:

^([01]?[0-9]|2[0-3])$ 

你命名Regex.IsMatch線在我的機器上的每個表達式返回true。