2014-01-14 3 views
4

Я пытаюсь соответствовать даты типа: ddmmyyyy , как: 04072001 До сих пор у меня есть это:Regex чтобы соответствовать дате типа: DDMMYYYY

^(?:(?:31(?:0?[13578]|1[02]))\1|(?:(?:29|30)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:290?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$

, который почти ((\/|-|\.))

+3

Что не работает? – Bohemian

+0

Итак, почему бы не просто удалить '(\/| - | \..)' Из ответа на этот другой вопрос? Что не работает? –

+0

Я не могу сопоставить пример выше (попробовал его в regexpal, и хотя ответ в ссылке отлично работает для dd/mm/yyyy, когда я удаляю (\/| - | \.), Он по-прежнему не соответствует – dimzak

ответ

3

Вы можете использовать что-то более простое:

^(0[1-9]|[1-2][0-9]|31(?!(?:0[2469]|11))|30(?!02))(0[1-9]|1[0-2])([12]\d{3})$ 

Он фиксирует день, месяц, год и проверяет все, кроме того, что 29 февраля фактически является високосным годом. (Чтобы сделать это, я просто выполнил математику на захваченный год/дату позже, а не пытался записать ее в выражение).

Рабочий пример: http://regex101.com/r/dH8mG3

Разъяснение:

- Capture the day: 01-29 
    - OR 31, if not succeeded by 02, 04, 06, 09, or 11 
    - OR 30, if not succeeded by 02 

- Capture the month: 01-12 
- Capture the year: 1000-2999 (you could narrow this down 
           by using number ranges like 
           (1[8-9]\d{2}|20\d{2}) == 1800-2099 
0

Регулярное выражение не является лучшим инструментом для этой работы.

Если это вообще возможно, просто соответствует ^\d{8}$ (или ^\d\d\d\d\d\d\d\d$ если вашему регулярное_выражению двигатель не поддерживает синтаксис {8}) , а затем программно проверить, что дата является действительной.

в немного более подробно:

  1. Match ^(\d\d)(\d\d)(\d\d\d\d)$ (настроить синтаксис при необходимости).
  2. Извлечь три группы соответствия и программно проверить, что они представляют собой действительную дату.

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

Итоговый код будет много легче читать и обслуживать.

(Кроме того, если у вас есть какой-либо контроль над форматом, рассмотреть возможность использование ГГГГММДДА, а не ДДММГГГГ, сортирует правильно, и это один из форматов, указанных в ISO 8601 стандарта.)

2

Не проверять даты, используя только RegEx. Возможно, ваш язык имеет встроенный объект даты со своими собственными методами и который вы можете использовать в сочетании с вашим вводом, формат, который вы подтвердили с помощью RegEx.

Смежные вопросы