He intentado esto muchas veces, incluso usando regex y los métodos len, left, mid y right, y parece que no puedo hacerlo bien. El objetivo es este aaa33aa4a7a6 ==> aaa33aa-aa-
Puede verificar si hay al menos dos o menos dígitos en la cadena y reemplazar los dígitos.
const regex = /\d(?=(\D*\d){0,2}\D*$)/g; console.log('abc12aa3b9c8'); console.log('abc12aa3b9c8'.replace(regex, '-')); console.log('abc12aa3b9c8x'); console.log('abc12aa3b9c8x'.replace(regex, '-'));Convierto la cadena en una matriz al revés. Luego itero esta nueva matriz y creo una nueva matriz por condición (cuento las coincidencias de números).
const str = `abc12aa3b9c8` let arr = str.split("").reverse(); let counter = 0; let newStr = [] arr.forEach(e => { if (isNaN(e)) { newStr.push(e) } else { newStr.push(counter < 2 ? '-' : e) counter++; } }) console.log('res',newStr.reverse().join(""))Divida su cadena en una matriz, invierta, reemplace lo que necesita, inviértalo nuevamente, únase a una cadena de resultado:
var str = 'abc12aa3b9c8'; var counter = 3; str = str .split('') .reverse() .map(function(char){ if( !isNaN( char ) && counter-- > 0 ) return '-'; return char }) .reverse() .join(''); console.log( str );