.NET ComponentModel.DataAnnotations与RegularExpression属性一起出现问题

时间:2011-10-12 16:05:14

标签: regex asp.net-mvc-3 validation

我必须验证一个应该包含小时数字的字符串(例如00到23)。

因此我设置了一个注释:

 [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 ...

编辑:我知道,使用字符串不是最好的想法,以便存储一个数字,但是,这个正则表达式问题很烦人。

4 个答案:

答案 0 :(得分: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);
    }

答案 1 :(得分:0)

试试这个:

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

答案 2 :(得分: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");
            }
        }
   }

答案 3 :(得分:0)

您必须将|分组才能正常工作。

我成功尝试了,这应该是你的正则表达式,但是分组并限制为start&端:

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

您的指定Regex.IsMatch行在我的计算机上的每个表达式上都返回true。