Lecciones del módulo (3/4)
Reemplazo con callback
Si una cadena de reemplazo no es suficiente, pasa una función:
str.replace(regex, (match, ...groups) => string). La callback se invoca para cada coincidencia y su valor de retorno se convierte en el reemplazo.
'prezzi: 10 20 30'.replace(/\d+/g, (m) => Number(m) * 1.22);
// "prezzi: 12.2 24.4 36.6" (22% IVA)Argumentos de la callback
str.replace(regex, (match, p1, p2, ..., offset, original, groups) => ...);match-- toda la coincidencia.p1,p2, … -- los grupos capturados en orden.offset-- índice de la coincidencia en la cadena original.original-- toda la cadena.groups-- objeto con los grupos nombrados (si los hay).
'2024-03-15'.replace(/(\d{4})-(\d{2})-(\d{2})/, (_, a, m, g) => `${g}/${m}/${a}`);
// "15/03/2024"La callback te otorga un poder arbitrario: análisis sintáctico, búsquedas, conversión, escape de HTML… todo lo que una cadena estática no puede hacer.
Argumentos avanzados en las callbacks de replace
La función callback recibe varios argumentos: la coincidencia completa, cada grupo capturado, la posición de la coincidencia dentro de todo el texto y la cadena de entrada original. Esto permite implementar una lógica de transformación sofisticada basada en el contexto.
Pruébalo tú
Encuentra cada número entero en el texto (en replace pasarías `(m) => Number(m) * 2` para duplicarlo).
Mostrar pista
Usa \d+ (uno o más dígitos) para capturar cada entero como una única coincidencia.
Solución disponible después de 3 intentos
Ejercicio de repaso
Encuentra cada correo electrónico (forma simplificada: letras/dígitos/puntos/guiones bajos @ dominio). De esta forma una callback podría redactarlo como `***@dominio`.
Mostrar pista
Amplía la clase a [\w.]+ para aceptar puntos en el nombre de usuario y en el dominio.
Solución disponible después de 3 intentos
Desafío adicional
Coincide con cada palabra que consista en letras en el texto, de modo que pueda transformarse a mayúsculas mediante una callback.
Mostrar pista
Encuentra letras simples con [a-zA-Z]+.
Solución disponible después de 3 intentos