Проверка регулярного выражения ASP.net MVC не работает - PullRequest
2 голосов
/ 13 мая 2011

У меня есть модель с рядом правил проверки, все из которых работают нормально, за исключением одной, предназначенной для проверки почтового индекса. Правило / свойство определяется следующим образом:

        [Required(ErrorMessage="Postcode is required")]
        [StringLength(20, ErrorMessage="Postcode must be under 20 characters")]
        [RegularExpression(@"[A-Za-z]{1,2}[0-9R][0-9A-Z]?[ ]?[0-9][A-Za-z-[CIKMOVcikmov]]{2}", ErrorMessage="Postcode is not valid")]
        public string Postcode { get; set; }

Каждый раз, когда почтовый индекс не проходит проверку RegEx, даже при использовании того же RegEx в онлайн-тестере (например, http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx) проходит. Вот пара примеров британских почтовых кодов, которые должны пройти: IP4 4DL и bn35fb

Ответы [ 2 ]

0 голосов
/ 15 мая 2011

Некоторые заметки:

  • Вы не предоставили строчные опции для R в группе [0-9R] или для последнего символа [0-9A-Z] перед пробелом. Если вы не используете опцию Игнорировать регистр, они будут соответствовать только заглавным буквам. А если вы используете Игнорировать регистр, то все остальные строчные диапазоны не нужны.
  • Скобки вокруг места не обязательны. ? оператор соответствует предыдущему символу, поэтому скобки понадобятся только в том случае, если в наборе имеется более одного символа.
  • Синтаксис, который я поставил под сомнение выше, не является стандартным. Я использую регулярные выражения в течение 10 лет, и я никогда не видел ничего подобного. Он «работает», в зависимости от вашего парсера, но даже не документирован в .NET парсере, где он работает. Обратите внимание, что он полностью потерпел неудачу - он даже не анализирует регулярное выражение правильно, а тем более не находит совпадений - в Javascript. лучший способ сделать это, который должен поддерживаться по всем направлениям, - это использовать [ABD-HJLNP-UW-Zabd-hjlnp-uw-z]. На RegexPal есть тестер регулярных выражений Javascript, и я проверил, что ваше выражение там не сработало, но с этим простым изменением оно сработало.
  • По отношению к предыдущему вы не указали, где фактически происходит проверка. Если вы используете валидатор на стороне клиента, он фактически запускается в Javascript, а не в .NET. Это может определенно объяснить, почему это выражение не подходит для этого выражения.

TL; DR: попробуйте заменить последний шаблон символа и посмотрите, начнет ли он работать.

0 голосов
/ 13 мая 2011

Я запустил этот тест

 var attr = new RegularExpressionAttribute(@"[A-Za-z]{1,2}[0-9R][0-9A-Z]?[ ]?[0-9][A-Za-z-[CIKMOVcikmov]]{2}");
 Assert.IsTrue(attr.IsValid("IP4 4DL"));

и, похоже, работает нормально.

Мое единственное предложение - проверить, нет ли пробелов по обе стороны от входящего почтового индекса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...