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

128
16 января 2020, 20:10

Мне нужно составить регулярное выражение что бы оно находило в тексте дату в разных форматах, при том записывая в совпадения только число и месяц (для дальнейего анализа), должно находить дату в следующих форматах:

01/12 1/11 (01/12/2001 1/11/2001)

22.12 3.11 (22.12.2002 3.11.2002)

02-09 4-08 (02-09-1999 4-08-1999)

2 мар 17 фев (2 мар 2007 17 фев 2007)

3 апреля 22 января (3 апреля 1989 22 января 1989)

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

 /(0?[1-9]|[12][0-9]|3[01])[\/\-\.](0?[1-9]|1[012])/

Вроде работает правильно 1. скажите пожалуйста на сколько такое выражение составлено грамотно? можно ли его улучшить? просто для проверки составил ли я его без косяков?

для дат где присутствуют буквенные названия месяцев пробую так:

 /(0?[1-9]|[12][0-9]|3[01])[- _](янв|фев|мар|апр|май|нюн|июл|авг|сен|окт|ноя|дек)/

и ещё одно для названий с полным месяцем

 /(0?[1-9]|[12][0-9]|3[01])[- _](января|февраля|марта|апреля|мая|нюня|июля|августа|сентября|октября|ноября|декабря)/
  1. Эти два выражения почему то работают не совсем правильно, выдают не точные совпадения как правильней в этом случае? Можно ли как то объединить эти 2 последних выражения в одно что бы оно тригереилось на сокращённые названия и полные? о том что бы объединить все 3 выражения в одно я пока молчу, но если есть способ то скажите пожалуйста?
Answer 1

Ваш регекс для цифровых дат следует дополнить блоком [ \/\.\-]:

/(0?[1-9]|[12][0-9]|3[01])[\/\-\.](0?[1-9]|1[012])[ \/\.\-]/

А для текстовых дат - посложнее:

/(0?[1-9]|[12][0-9]|3[01]) (янв(?:аря)?|фев(?:раля)?|мар(?:та)?|апр(?:еля)?|мая|июн(?:я)?|июл(?:я)?|авг(?:уста)?|сен(?:тября)?|окт(?:ября)?|ноя(?:бря)?|дек(?:абря)?)/

Очень рекомендую сайт regex101 - отлично подходит для разработки и тестирования регексов

Когда Вы введете свое первое выражение, то увидите, почему оно отрабатывает неправильно.

READ ALSO
Смена картинки при очищение поля vuetify

Смена картинки при очищение поля vuetify

работаю c vuejs, в частности с vuetify

109
Как задать двойную шкалу у range slider?

Как задать двойную шкалу у range slider?

Нужно сделать вот такой слайдер:

101
Обрезанная рамка с фоном

Обрезанная рамка с фоном

Возникла проблема с рамкойРаньше использовал простой :after и ставил тексту фон, тут же на фоне картинка, и такой вариант не прокатывает

87