Регулярное выражение для определения yyyy-MM-dd - PullRequest
9 голосов
/ 09 марта 2011

Я использую asp.net 4 и c #.

Мне нужно использовать WebControl типа Validation, а именно RegularExpressionValidator, чтобы обнаружить данные, введенные в TextBox, которые IS NOT in format yyyy-MM-dd (String).

Есть идеи, как написать RegEx для применения этого элемента управления?

Спасибо

Ответы [ 7 ]

15 голосов
/ 09 марта 2011

Вот одно из возможных регулярных выражений:

^\d{4}-((0\d)|(1[012]))-(([012]\d)|3[01])$

Примечание: это предотвратит месяцы> 12 и дни> 31, но не будет проверять конкретные месяцы на продолжительность (то есть не будет блокировать 30 февраля или 31 апреля). Вы могли бы написать регулярное выражение, чтобы сделать это, но это было бы довольно долго, и 29 февраля всегда будет доставлять вам проблемы в регулярном выражении.

Я бы сказал, что если вам нужна такая детальная проверка, вам лучше проанализировать дату с помощью библиотеки дат; регулярное выражение не инструмент для вас. Это регулярное выражение должно быть достаточно для базовой предварительной проверки.

Я также стал снисходительным в этом году; просто проверяю, что это четыре цифры. Но если вам нужна какая-то проверка работоспособности (то есть в определенных пределах), ее не должно быть слишком сложно добавить. Например, если вы хотите сопоставить только даты в этом столетии, вы должны заменить \d{4} в начале регулярного выражения на 20\d{2}. Опять же, попытка проверить дату с чрезмерной точностью в регулярном выражении будет трудной, и вы должны использовать анализатор дат, но вы можете легко получить базовое сопоставление на уровне столетия, чтобы пользователь не мог ввести что-то действительно глупое.

Наконец, я поставил ^ и $, чтобы связать концы строки, чтобы она не могла совпадать, если пользователь вводит правильную дату и дополнительные символы. (Вы также можете добавить валидатор длины строки для этого).

Надеюсь, это поможет.

8 голосов
/ 06 марта 2013

Ответ Спадли, приведенный выше, допускает 00 для дня и месяца.

Я исправил это:

^\d{4}-((0[1-9])|(1[012]))-((0[1-9]|[12]\d)|3[01])$

Примечание: ни одно из этих выражений не проверяет недействительные дни в месяце, например 04/ 31, 06/31 или 02/29 о не високосных годах.

5 голосов
/ 09 марта 2011

Регулярное выражение \d\d\d\d-\d\d-\d\d должно сработать.

3 голосов
/ 18 марта 2013

Я хотел бы добавить небольшое изменение в ответе Спудли:

^\d{4}$|^\d{4}-((0?\d)|(1[012]))-(((0?|[12])\d)|3[01])$

, поэтому вы можете использовать дату, например 2013-5-5 (месяц и дата не обязательно должны быть нулем, но могут использоваться)

Надеюсь, это поможет.

0 голосов
/ 25 августа 2014
(19|20)[0-9]{2}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])

Маха результат:

1999-09-12

0 голосов
/ 28 мая 2014
((([0-9][0-9][0-9][1-9])|([1-9][0-9][0-9][0-9])|([0-9][1-9][0-9][0-9])|([0-9][0-9][1-9][0-9]))-((0[13578])|(1[02]))-((0[1-9])|([12][0-9])|(3[01])))|((([0-9][0-9][0-9][1-9])|([1-9][0-9][0-9][0-9])|([0-9][1-9][0-9][0-9])|([0-9][0-9][1-9][0-9]))-((0[469])|11)-((0[1-9])|([12][0-9])|(30)))|(((000[48])|([0-9]0-9)|([0-9][1-9][02468][048])|([1-9][0-9][02468][048]))-02-((0[1-9])|([12][0-9])))|((([0-9][0-9][0-9][1-9])|([1-9][0-9][0-9][0-9])|([0-9][1-9][0-9][0-9])|([0-9][0-9][1-9][0-9]))-02-((0[1-9])|([1][0-9])|([2][0-8])))

Это регулярное выражение для формата yyyy-MM-dd.

Вы можете заменить - на \/ для yyyy/MM/dd ...

Проверено, работает отлично ..

0 голосов
/ 05 сентября 2013

Другая реализация для структурированных дат ISO 8601:

^ \ д {4} - \ d {1,2} - \ d {1,2} \ s \ d {1,2}: \ д {1,2}: \ д {1,2} .? \ d {0} $

Он не такой строгий и будет принимать неправильные даты, но он должен подтвердить, что он соответствует структуре ISO 8601, даже если дата не существует. Это также должно быть достаточно простым для понимания для любого, кто имеет базовое понимание Regex.

Если вы действительно хотите убедиться в правильности даты и работать с ней, запустите на ней DateTime.TryParse ().

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