Регулярные выражения не нужны:
const insert = (str, substr, ...indices) => [ 0 ]
.concat(indices)
.filter(n => 0 <= n && n <= str.length)
.sort((a, b) => a - b)
.map((n, i, a) => str.slice(n, a[i + 1]))
.join(substr);
// или
const insert = (str, substr, ...indices) => indices
.sort((a, b) => b - a)
.reduce((acc, n) => (
0 <= n && n <= str.length && acc.splice(n, 0, substr),
acc
), [...str])
.join('');
// или
const insert = (str, substr, ...indices) =>
''.concat(...Array.from(
{ length: -~str.length },
function(_, i) {
return substr.repeat(this[i] ?? 0) + str.charAt(i);
},
indices.reduce((acc, n) => (acc[n] = -~acc[n], acc), {})
));
Но, конечно, можно и с ними:
const insert = (str, substr, ...indices) => indices
.filter(n => 0 <= n && n <= str.length)
.sort((a, b) => a - b)
.reduce((acc, n, i) =>
acc.replace(RegExp(`(?<=^.{${n + i * substr.length}})`), substr)
, str);
Как использовать:
// ваш случай
const str = insert(`${number}`, '-', 3, 5, 8, 10);
// вставлять можно больше одного символа
insert('abc', ' --> ', 1, 2) // 'a --> b --> c'
// можно по одному индексу несколько раз делать вставку
insert('abc', '~', 0, 0, 0) // '~~~abc'
// за границы строки вставка не выполняется,
// за исключением позиции сразу же после конца строки
insert('abc', '!', -1, 3, 4) // 'abc!'