Вы можете сопоставить шаблон типа даты и использовать группы захвата для извлечения части месяца или дня.Часть месяца и дня находится в первой или третьей группе захвата, и для получения согласованных разделителей вы можете использовать обратные ссылки на группы захвата.
Чтобы получить отдельные значения, которые можно разделить на совпадающие, а не цифры \D
(?:\d{4}(([- .]|\. )\d{2}\2\d{2})\.? |(\d{1,2}([-\/ ]|\. )\d{1,2})\4\d{4} )\d{2}:\d{2}:\d{2}
(?:
Группа без захвата \d{4}
Соответствие4 цифры (
Группа захвата 1 (
Группа захвата 2 [- .]|\.
Совпадение либо -
, /
, пробел ИЛИ точка и пробел
)
Закрыть группу захвата 2
\d{2}\2\d{2}
Матч 2 цифры, обратная ссылка на группу 2, 2 цифры )
Закрыть группу 1
\.?
Соответствовать необязательной точке и пробелу |
Или (
Группа захвата 3 \d{1,2}
соответствует 1-2 цифрам ([-\/ ]|\.? )
Группа 4, соответствует либо -
, /
, пробел ИЛИ точка и пробел
\d{1,2})\4\d{4}
Совпадение 1-2 цифр, обратная ссылка на группу 4 и 4 цифры )
Закрытие группы без захвата \d{2}:\d{2}:\d{2}
Совпадение по части, подобной времени,
Regex demo
Например:
let pattern = /(?:\d{4}(([- .]|\. )\d{2}\2\d{2})\.? |(\d{1,2}([-\/ ]|\.? )\d{1,2})\4\d{4} )\d{2}:\d{2}:\d{2}/;
[
"2019-01-05 23:59:59",
"2019 01 05 23:59:59",
"2019. 01. 05. 23:59:59",
"2019.01.05. 23:59:59",
"05-01-2019 23:59:59",
"5-1-2019 23:59:59",
"05/01/2019 23:59:59",
"5/1/2019 23:59:59",
"5 1 2019 23:59:59",
"05 1 2019 23:59:59",
"05. 1. 2019 23:59:59",
"5. 1. 2019 23:59:59"
].forEach(s => {
let m = s.match(pattern);
let res = m[1] || m[3];
console.log(res.split(/\D+/).filter(Boolean));
});
В качестве альтернативы, основанной на вашем паттерне, вместо использования 2 положительных просмотров (?=
, вы можете использовать 2 отрицательных просмотра (?!
, чтобы утверждать, что слеваи то, что справа, не является цифрой, но это не будет учитывать дату, подобную шаблону.
Чтобы получить только одно совпадение, вы можете опустить глобальный флаг /g
/(?<!\d)\d{1,2}(?!\d)/
Regex demo
Обратите внимание , что внешний вид не поддерживается широко и будет работать в Chrome.
[
"2019-01-05 23:59:59",
"2019 01 05 23:59:59",
"2019. 01. 05. 23:59:59",
"2019.01.05. 23:59:59",
"05-01-2019 23:59:59",
"5-1-2019 23:59:59",
"05/01/2019 23:59:59",
"5/1/2019 23:59:59",
"5 1 2019 23:59:59",
"05 1 2019 23:59:59",
"05. 1. 2019 23:59:59",
"5. 1. 2019 23:59:59"
].forEach(s => console.log(s.match(/(?<!\d)\d{1,2}(?!\d)/)[0]));
Без просмотра за спиной вы можете использовать группу захвата и начать матч с начала строки ^
или без цифры \D
:
(?:^|\D)(\d{1,2})(?!\d)
Regex demo