Мне удалось сделать это без регулярного выражения, я знаю, что это не то, о чем вы просили, но я все равно опубликую свое решение. Однако учтите, что вам следует избегать регулярных выражений, если возможно собственное решение, поскольку регулярное выражение довольно старое и медленное по сравнению с ванильным кодом.
const onKeyup = (e) => {
const input = document.getElementById('input');
const value = input.value;
let _value = value;
if(e.keyCode != 8) {
if(_value.length == 1)
_value = `+1 ${_value}`;
else if(_value.length == 6 || value.length == 10)
_value = _value + ' ';
else if(_value.length == 13)
_value = _value + '-'
}
input.value = _value
}
const input = document.getElementById('input').addEventListener('keyup', onKeyup)
<input id="input" onkeyup="onKeyup()" />
Также, если вы вызываете функцию из HTML, параметр события не будет передан, поэтому вам нужно добавить слушателя из javascript.
Надеюсь, это поможет. Очевидно, что это базовый сценарий, но вы можете использовать его в качестве отправной точки.