Измените регулярное выражение так, чтобы оно совпадало с датами "st", "nd", "rd", "th" - PullRequest
1 голос
/ 22 января 2010

Как можно изменить приведенное ниже регулярное выражение для сопоставления дат с порядковыми номерами в части дня? Это регулярное выражение соответствует «1 января 2003 г. | 29 февраля 2004 г. | 02 ноября 3202 года», но мне нужно, чтобы оно также соответствовало: «1 января 2003 г. | 29 февраля 2004 г. | 02 ноября, 3202 | 3 марта 2010 г.»

^(?:(((Jan(uary)?|Ma(r(ch)?|y)|Jul(y)?|Aug(ust)?|Oct(ober)?|Dec(ember)?)\ 31)|((Jan(uary)?|Ma(r(ch)?|y)|Apr(il)?|Ju((ly?)|(ne?))|Aug(ust)?|Oct(ober)?|(Sept|Nov|Dec)(ember)?)\ (0?[1-9]|([12]\d)|30))|(Feb(ruary)?\ (0?[1-9]|1\d|2[0-8]|(29(?=,\ ((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)))))))\,\ ((1[6-9]|[2-9]\d)\d{2}))

Спасибо.

Ответы [ 2 ]

5 голосов
/ 22 января 2010

Это будет зависеть от вашего варианта использования, но в интересах прагматизма, вы могли бы преуспеть, чтобы просто найти что-нибудь подходящее:
(1) любое название месяца или сокращение;
(2) пробел;
(3) любая одна или две цифры;
(4) пробела;
(5) любой ст, й, й, й;
(6) пробел ИЛИ запятая + необязательный пробел;
(7) любые четыре цифры;

Я не уверен, что вы подходите, но если бы у меня был Jan 35nd,3001, я бы предпочел захватить его сейчас и сделать недействительным позже , чем просто пропустить его прямо в Начало.

Кроме того, в зависимости от набора данных, учитывайте проблемы чувствительности к регистру и общие международные варианты английского языка, такие как 1 Jan 2004 или 1st Jan, 2004 или January, 2004 и т. Д.

добавлены разрывы строк

^(?:j(?:an(?:uary)?|un(?:e)?|ul(?:y)?)?|feb(?:ruary)?|ma(?:r(?:ch)?|y)
|a(?:pr(?:il)?|ug(?:ust)?)|sep(?:t|tember)?|oct(?:ober)?|(?:nov|dec)(?:ember)?)  
\s+\d{1,2}(?:st|nd|rd|th)?(?:\s+|,\s*)\d{4}\b

Еще более прагматичным (и читаемым ), если у вас нет очень странного набора данных, является разрешение чего-либо после общих префиксов:

(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)[a-z]*?\s+\d{1,2}(?:[a-z]{2})?(?:\s+|,\s*)\d{4}\b

Будет ли это соответствовать octagenarianism 99xx, 0000? Да. Это может быть проблемой? Я сомневаюсь в этом.

2 голосов
/ 22 января 2010

Это регулярное выражение делает слишком много. Вам было бы намного лучше, если бы вы использовали эквивалент вашего языка strptime(). Однако приведенное ниже регулярное выражение будет соответствовать порядковым номерам:

^(?:(((Jan(uary)?|Ma(r(ch)?|y)|Jul(y)?|Aug(ust)?|Oct(ober)?|Dec(ember)?)\ 31(st)?)|((Jan(uary)?|Ma(r(ch)?|y)|Apr(il)?|Ju((ly?)|(ne?))|Aug(ust)?|Oct(ober)?|(Sept|Nov|Dec)(ember)?)\ (0?[1-9]|([12]\d)|30))(st|nd|rd|th)?|(Feb(ruary)?\ (0?[1-9]|1\d|2[0-8]|(29(th)?(?=,\ ((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)))))(st|nd|rd|th)?))\,\ ((1[6-9]|[2-9]\d)\d{2}))

Обратите внимание, что он также будет соответствовать вещам типа "20-й", но вероятность встретить это в реальных данных слишком мала, чтобы в большинстве случаев беспокоиться.

...