Вот одно из возможных регулярных выражений:
^\d{4}-((0\d)|(1[012]))-(([012]\d)|3[01])$
Примечание: это предотвратит месяцы> 12 и дни> 31, но не будет проверять конкретные месяцы на продолжительность (то есть не будет блокировать 30 февраля или 31 апреля). Вы могли бы написать регулярное выражение, чтобы сделать это, но это было бы довольно долго, и 29 февраля всегда будет доставлять вам проблемы в регулярном выражении.
Я бы сказал, что если вам нужна такая детальная проверка, вам лучше проанализировать дату с помощью библиотеки дат; регулярное выражение не инструмент для вас. Это регулярное выражение должно быть достаточно для базовой предварительной проверки.
Я также стал снисходительным в этом году; просто проверяю, что это четыре цифры. Но если вам нужна какая-то проверка работоспособности (то есть в определенных пределах), ее не должно быть слишком сложно добавить. Например, если вы хотите сопоставить только даты в этом столетии, вы должны заменить \d{4}
в начале регулярного выражения на 20\d{2}
. Опять же, попытка проверить дату с чрезмерной точностью в регулярном выражении будет трудной, и вы должны использовать анализатор дат, но вы можете легко получить базовое сопоставление на уровне столетия, чтобы пользователь не мог ввести что-то действительно глупое.
Наконец, я поставил ^
и $
, чтобы связать концы строки, чтобы она не могла совпадать, если пользователь вводит правильную дату и дополнительные символы. (Вы также можете добавить валидатор длины строки для этого).
Надеюсь, это поможет.