Регулярное выражение для проверки масок формата даты


Я ищу, чтобы написать регулярное выражение для проверки введенных пользователем форматов даты, таких как "DD / MM/YYYY" (не проверка даты)

Я новичок в регулярном выражении, но пока у меня есть следующее:

(D{2}|M{2}|Y{2,4})[-|/]?(D{2}|M{2})[-|/]?(D{2}|M{2}|Y{2,4})

Это соответствует следующей дате форматы:

  • ДД / ММ / ГГГГ
  • ММ/ДД/ГГГГ
  • ДД-ММ-ГГГГ
  • ММ-ДД-ГГГГ
  • DDMMYYYY
  • MMDDYYYY
  • YYYYMMDD
  • YYYYDDMM
  • ГГГГ / ММ / ДД
  • ГГГГ/ДД / ММ
  • ГГГГ-ММ-ДД
  • ГГГГ-ДД-ММ
  • ДД / ММ / ГГ
  • ММ/ДД/ГГ
  • DD-MM-YY
  • ММ-ДД-ГГ
  • DDMMYY
  • MMDDYY
  • YYMMDD
  • YYDDMM
  • YY / MM/DD
  • YY/DD / MM
  • YY-MM-DD
  • YY-DD-MM

Но к сожалению, также соответствует следующему:

  • DDMMDD
  • YYMMYYYY
  • мммммм

Существует ли какой-либо способ только соответствовать форматам, указанным в первом списке? Регулярное выражение будет использоваться при проверке формы VBA.

2 3

2 ответа:

Вы можете использовать отрицательные обратные ссылки, чтобы убедиться, что вы не повторяете предыдущие записи:

^(D{2}|M{2}|(YY){1,2})[-|\/]?(?!\1)(D{2}|M{2})[-|\/]?((?!\1|\3)(D{2}|M{2}|(YY){1,2}))$

Отрицательная обратная связь (?!\1) & (?!\1 / \3) предотвратить повторение записей.

Также{2,4} соответствует 'ыыы', поэтому я изменил это (ый){1,2}.

Не проверено на VBA, но как насчет этого:

^(((MM(?<s>[-/])?DD|DD(?<s>[-/])?MM)(?(s)[-/])?(YY|YYYY))|((YY|YYYY)(?<s>[-/])?(MM(?(s)[-/])DD|DD(?(s)[-/])MM)))$
Процесс мышления состоял в том, что существует четыре возможных комбинации, игнорирующие разделители и количество цифр в течение года. Это:

D M Y

M D Y

Y M D

Y D M

Таким образом, это можно разделить на две группы - Год в начале или год в конце:
^
(((MM(?<s>[-/])?DD|DD(?<s>[-/])?MM)(?(s)[-/])?(YY|YYYY))
|
((YY|YYYY)(?<s>[-/])?(MM(?(s)[-/])DD|DD(?(s)[-/])MM)))
$

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