Проблема .NET ComponentModel.DataAnnotations с атрибутом RegularExpression - PullRequest
1 голос
/ 12 октября 2011

Мне нужно проверить строку, которая должна содержать номер часа (например, от 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]")

возвращает истину ...

Редактировать: Я знаю, использование строки - не лучшая идея для хранения числа, тем не менее, эта проблема регулярных выражений раздражает.

Ответы [ 4 ]

2 голосов
/ 21 ноября 2011

Этот шаблон будет работать.Я столкнулся с то же самое .Это связано с использованием паренов, чтобы правильно установить группировки.Если атрибут 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 голосов
/ 22 ноября 2011

Вы должны сгруппировать | для правильной работы.

Я успешно попробовал, который должен быть именно вашим регулярным выражением, но сгруппирован и ограничен началом и концом:

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

Ваша именованная строка Regex.IsMatch возвращает true для каждого выражения на моем компьютере.

0 голосов
/ 20 октября 2011

Не знаю, почему это регулярное выражение неправильно интерпретируется, но решение состоит в том, чтобы реализовать 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 голосов
/ 12 октября 2011

Попробуйте это:

[RegularExpression("2[0-3]|[01]?[0-9]", ErrorMessage = "Error")]
 public string JobStartHour {...}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...