Это будет зависеть от вашего варианта использования, но в интересах прагматизма, вы могли бы преуспеть, чтобы просто найти что-нибудь подходящее:
(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
? Да. Это может быть проблемой? Я сомневаюсь в этом.