Выражение регулярного выражения для даты в диапазоне дат - PullRequest
0 голосов
/ 02 октября 2019

Мне нужно с помощью регулярного выражения проверить дату в формате гггг-мм-дд (2019-12-31), которая должна быть в диапазоне 2019-12-20 - 2020-01-10. Что будет регулярным выражением для этого? Спасибо

Ответы [ 2 ]

1 голос
/ 02 октября 2019

Регулярные выражения имеют дело только с персонажами. поэтому мы должны определить для каждой позиции даты, какие символы являются допустимыми.

Первая часть проста. Первые два символа должны быть 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))

Обратите внимание, что я предполагаю, что датаВы проверяете, правильно ли отформатирована дата.

0 голосов
/ 02 октября 2019

Попробуйте это:

(2019|2020)\-(12|01)\-([0-3][0-9]|[0-9])

Но имейте в виду, что это позволит число, вплоть до первой цифры от нуля до трех и второй цифры от нуля до девяти дляdd значение. Вы можете указать все числа, которые вы хотите разрешить (от 20 до 10), например: (20|21|22|23|24|25|26|27|28|29|30|31|01|1|02|2|03|3|04|4|05|5|06|6|07|7|08|8|09|9|10).

(2019|2020)\-(12|01)\-(20|21|22|23|24|25|26|27|28|29|30|31|01|1|02|2|03|3|04|4|05|5|06|6|07|7|08|8|09|9|10)

Но, честно говоря ... Регулярные выражения не являютсяправильный инструмент для этого. RegExp дает маску чему-то, а не логический контекст. Используйте regex, чтобы извлечь данные / значение из строки и проверить эти значения на другом языке.

Вышеуказанное второе регулярное выражение будет соответствовать вашим датам, но также и значениям за пределами этого диапазона, поскольку нетконтекст между 2019|2020 и второй группой 12|01, чтобы они соответствовали значениям, таким как 2019-12-11, но также 2020-12-11.

Чтобы соответствовать только требуемым значениям, это будет очень большое регулярное выражение, подобное этому (внутреннемузаключите в скобки, только если они вам нужны) ((2019)-(12)-(20)|(2019)-(12)-(21)|(2019)-(12)-(22)|...) и продолжайте со всеми возможными датами - и спросите себя: что бы вы сделали, если бы нашли такое регулярное выражение в проекте, с которым вам придется работать;)

Лучшее решение (быстро и грязно, возможно, есть лучшие решения):
(?<yyyy>20[0-9]{2})\-(?<mm>[01][0-9]|[0-9])\-(?<dd>[0-3][0-9]|[0-9])

Таким образом, у вас есть три именованные группы (гггг, мм, дд), к которым вы можете получить доступ и проверить соответствующие значения ... Регулярное выражениечем меньше, тем лучше связь между кодом и регулярным выражением, и оба легче поддерживать.

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