Найти в Дзене
Легко в’IT

Пример разбора регулярного выражения

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

/(?<![0-9.])
(?P<day>
0?[1-9] | # 1-9 , 01-09
[12][0-9] | # 10-29
3[01] # 30-31
) \\.
(?(?=0?[469]|11)(?<!31\\.)|) # month of 30 day
(?(?=0?2)(?<!3[01]\\.)|) # feb not 30 31
(?(?=0?2\\.\\d\\d(?!00)(?:[02468][048]|[13579][26]))|(?<!29\\.)) # февраль високосные года и 2000 2400 2800...
(?P<month>0?[1-9]|1[12]) \\.
(?P<year>19[0-9][0-9]|20[0-9][0-9])(?!\\d)/

  • Для начала оно было разбито на группы, чтобы отдельно получать день (?P<day>), месяц (?P<month>) и год (?P<year>). Как ты догадываешься, в регулярках между треугольными скобками пишется название группы, но в начале названия группы нужно указать директиву ?P, которая Говорит, что дальше идет название группы
  • Далее разбираем день: его можно написать как одним символом 1, 5, 8, так и двумя 01, 05, 08. Это и проверяется в слудующей строке.
  • После этого пара строк, которые проверяют двузначные дни и чтобы они не заходили за 31 день
  • Следующим идет разделитель в виде точки, но так как точка - это специальный символ для регулярных выражений, означающий люой 1 символ, вообще любой, то нам нужно ее экранировать, чтобы она воспринималась ТОЛЬКО как точка и ни что другое, для этого мы пишем перед ней обратный слеш.
  • Три следующие строчки мы пишем месяца, в которых бывают 30 и 31 день. Сработает, как ты понимаешь, только одна из них, в зависимости от месяца, о чем нам и говорит условная запись (?(?=...)что делаем еси да|что делаем если нет). Причем на третьей строчке, проверяющей число мы записали поиск для високосных годов: [02468][048]|[13579][26]
  • Ну и в конце, в двух строчках - достаточно просто, особенно после всего предыдущего мы ищем месяц, с проверкой чтобы он был не больше 12 и год, который должен быть о четырех числах, не более 2099, так что как видишь, эту регулярку при необходимости тоже можно улучшить, заменив 20[0-9][0-9] например на 2[0-9][0-9][0-9], получив максимальный год - 2999

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

Я надеюсь, что тебе этот разбор окажется полезным и ты обязательно на меня подпишешься, поставишь лайк и откомментишь!