Регулярное выражение для обнаружения гггг-ММ-ДД

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

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

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

спасибо

7 ответов


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

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

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

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

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

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

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


приятель выше позволяет 00 за день и месяц.

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

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

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


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


Я хотел бы добавить немного меняться в ответ приятель это:

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

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

надеюсь, что это помогает.


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

выражение^\D{4}-\Д{1,2}-\д{1,2}\ы\д{1,2}: выражение\D{1,2}: выражение\D{1,2}.?\d{0,}$

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

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


(19|20)[0-9]{2}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])

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

1999-09-12


((([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])))

Это regex для .

вы можете заменить - С \/ на yyyy/MM/dd...

проверено работает идеально..