Регулярные выражения имеют дело только с персонажами. поэтому мы должны определить для каждой позиции даты, какие символы являются допустимыми.
Первая часть проста. Первые два символа должны быть 20
Теперь становится все сложнее, следующий символ может быть 1
или 2
, но то, что следует, зависит от значения этого символа, поэтому мы разбиваем оставшуюся часть регулярного выражения на две части:первый, если третий символ соответствует 1
, и второй, если он соответствует 2
. Мы знаем, что если третий символ представляет собой 1
, то после символов начинается 9-12-
, когда начинается диапазонв 2019-12-20 сейчас для дневной части. Девятый символ - это десятки за день, который может быть только 2
или 3
, поскольку мы уже в прошлом месяце, а минимальная дата - 20. Последний символ может быть любой цифрой 0-9. Это дает нам дневное совпадение [23] [0-9]. Соединив это вместе, теперь у нас есть шаблон для лет, начинающихся с 2019 года, в виде 19-12-[23][0-9]
Если третий символ равен 2
, то мы можем сопоставить до дневной части даты усиление, когда диапазон заканчивается вянварь. Это дает нам частичное совпадение 20-01-
, что позволяет нам работать над частью дня. Слышим, что мы знаем, что первый символ дня может быть 1
или 0
, однако, если это 1
, тогда последний символ должен быть 0
, а если это 0
, то последний символ можетбыть только в диапазоне от 1
до 9
. Это дает нам еще одно изменение (?:0[1-9]|10)
Соединяя вторую часть, мы получим 20-01-(?:0[1-9]|10)
.
Объединяя их вместе, получаем окончательное регулярное выражение 20(?:19-12-[23][0-9]|20-01-(?:0[1-9]|10))
Обратите внимание, что я предполагаю, что датаВы проверяете, правильно ли отформатирована дата.