Как я понял, вам требуется, чтобы каждая часть даты / времени (день, месяц, год, час и минута) должна присутствовать .
Итак, выследует удалить ?
после соответствующих групп (они не необязательны).
Рекомендуется также, чтобы каждая группа была зарегистрирована как соответствующая группа захвата .
Нет необходимости писать что-то вроде jun(?:i)?
.Достаточно (и легче читать), когда вы пишете только juni?
(?
относится только к предшествующему i
).
Еще один совет: поскольку язык регулярных выражений содержит \d
класс char,используйте только его вместо [0-9]
(регулярное выражение короче и его легче читать.
Необязательные части (в / вокруг) должны быть необязательной группой без захвата.
Что-нибудь послеминутная часть не требуется в регулярном выражении.
Поэтому я предлагаю регулярное выражение, как показано ниже (для удобства чтения я разделил его на строки):
(\d{1,2})[ -](jan(?:uari)?|feb(?:ruari)?|m(?:aa)?rt|apr(?:il)?|mei|juni?
|juli?|aug(?:ustus)?|sep(?:tember|t)?|okt(?:ober)?|nov(?:ember)?|dec(?:ember)?)
[ -](\d{4}) (?:around |at )?(\d{1,2}:\d{1,2})
Подробности:
(\d{1,2})
- День. [ -]
- Разделитель после дня (пробел или минус). (jan(?:uari)?|...dec(?:ember)?)
- Месяц. [ -]
- Разделитель после месяца. (\d{4})
- год. (?:around |at )?
- Собственно, 3 варианта разделителя между годом и часом (пробел / около / в ), обратите внимание на пробел перед (...)? . (\d{1,2}:\d{1,2})
- Час и минута.
Соответствует вариантам 1, 2, 3, 5и 13. Все остальные не содержат каждой требуемой части, поэтому они не совпадают.
Если вы разрешите, например, что часть часа / минуты является необязательной, измените соответствующий фрагмент на:
( (?:around |at )?(\d{1,2}:\d{1,2}))?
т.е. окружите пространство / около / в / час / минуту с помощью (
и )?
, делая эту часть дополнительной группой.Затем также будут сопоставлены варианты 14 и 15.
Еще одно расширение: если вы также разрешите час / минуту часть только , добавьте |(\d{1,2}:\d{1,2})
кregex (all before - первый вариант, а добавленная часть - второй вариант только для час / минута .
Тогда ваши варианты № 4 и 6 также будут сопоставлены.
Рабочий пример см. https://regex101.com/r/33t1ps/1
Редактировать
Следуя вашему списку правил, я предлагаю следующее регулярное выражение:
(\d{1,2}[ -])?
- День+ разделитель, необязательный. (jan(?:uari)?|...|dec(?:ember)?)
- Месяц. (?:[ -](\d{4}|'\d{2}))?
- Разделитель + год (4 или 2 цифры с «»). ( (?:around |at )?(\d{1,2}:\d{1,2}))?
- Разделитель + час / минута - необязательный конец варианта 1. |(\d{1,2}:\d{1,2})
- Вариант 2 - только час и минута.
Не соответствует только вашим вариантам № 9и 10.
Полное регулярное выражение, включая также "uur", см. https://regex101.com/r/33t1ps/3