\d
– одна цифра
(\d)
– одна цифра, и мы её запомнили, чтобы потом вывести через $1, $2, ... $8
\s
– один пробельный символ
\s?
– один пробельный символ, но если его нет - тоже ок
\-
– один символ дефиса (тоже надо экранировать)
\-?
– один символ дефиса, если его нет, то и ладно.
Допуская одиночные пробелы в любом месте где-то между:
var re = /(\d)\s?(\d)\s?(\d)\s?(\d)\s?\-?\s?(\d)\s?(\d)\s?(\d)\s?(\d)/;
var tests = [
'1600 1800', // 16:00 - 18:00
'16001800', // 16:00 - 18:00
'abc def 16001800 geh', // abc def 16:00 - 18:00 geh
'zzzz16001800zzz' // zzzz16:00 - 18:00zzz
];
tests.map(e => e.replace(re, '$1$2:$3$4 - $5$6:$7$8'))
Подводные камни:
- про двоеточия в исходном тексте не говорили
- заменит любую последовательность из 8 цифр, в т.ч. из номера телефона
+7 495 5554321
сделает +74:95 - 55:54321
- минус "-" это не короткое "–" или длинное "—" тире, если в исходном тексте будут тире, не заметит.