Регулярное выражение для проверки масок формата даты
Я ищу, чтобы написать регулярное выражение для проверки введенных пользователем форматов даты, таких как "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 ответа:
Вы можете использовать отрицательные обратные ссылки, чтобы убедиться, что вы не повторяете предыдущие записи:
^(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))) $
Я также добавляю именованную группу захвата в разделитель, чтобы убедиться, что по крайней мере два одинаковых символа существуют, если они присутствуют.