Reemplazo: replace() y replaceAll()
Aprende a reemplazar una o todas las ocurrencias de subcadenas y patrones regex en strings usando replace() y replaceAll(), con ejemplos prácticos y mejores prácticas.
TL;DR - Resumen rápido
- replace() reemplaza solo la primera ocurrencia por defecto
- replaceAll() reemplaza todas las ocurrencias en una sola operación
- Ambos métodos aceptan strings o expresiones regulares como patrón de búsqueda
- Los strings son inmutables: estos métodos devuelven un nuevo string
- Puedes usar funciones callback para lógica de reemplazo dinámico
- Las expresiones regulares con flag 'g' en replace() también reemplazan todo
Introducción a replace() y replaceAll()
Los métodos replace() y replaceAll() son herramientas fundamentales para manipular strings en JavaScript. Permiten buscar y reemplazar subcadenas específicas o patrones complejos, lo que es esencial para limpieza de datos, formateo de texto, sanitización de input y muchas otras tareas comunes en desarrollo web.
Aunque ambos métodos parecen similares, tienen diferencias importantes en su comportamiento predeterminado. replace() solo reemplaza la primera ocurrencia que encuentra, mientras que replaceAll() reemplaza todas las coincidencias automáticamente. Comprender cuándo usar cada uno es crucial para escribir código eficiente y evitar bugs sutiles.
Diferencia Clave entre replace() y replaceAll()
replace() reemplaza solo la primera coincidencia por defecto, mientras que replaceAll() siempre reemplaza todas las coincidencias. Sin embargo, replace() con una expresión regular que tiene el flag 'g' (global) también reemplaza todas las ocurrencias. replaceAll() fue introducido en ES2021 como una alternativa más clara y legible.
Método replace(): Reemplazo Simple
El método replace() busca la primera ocurrencia de un patrón especificado y la reemplaza con un nuevo valor. Este método es útil cuando solo necesitas cambiar una instancia específica de una subcadena o cuando estás seguro de que el patrón aparece solo una vez en el string.
Este ejemplo muestra el comportamiento predeterminado de replace(). Cuando usas un string como patrón de búsqueda, solo la primera ocurrencia se reemplaza. Esto es importante de recordar porque puede causar bugs si esperas que todas las instancias sean modificadas. El método siempre devuelve un nuevo string, ya que los strings en JavaScript son inmutables.
Advertencia: Mutabilidad de Strings
Los strings en JavaScript son inmutables. Los métodos replace() y replaceAll() NO modifican el string original, sino que devuelven un NUEVO string con los cambios. Siempre debes asignar el resultado a una variable o usarlo directamente, o los cambios se perderán.
Método replaceAll(): Reemplazo Global
El método replaceAll() fue introducido en ES2021 para simplificar el reemplazo de todas las ocurrencias de un patrón. A diferencia de replace(), este método reemplaza automáticamente todas las coincidencias sin necesidad de usar expresiones regulares con el flag 'g'. Es más legible y menos propenso a errores.
Este ejemplo demuestra cómo replaceAll() reemplaza todas las ocurrencias del patrón de búsqueda. Cuando usas un string literal como patrón, replaceAll() reemplaza todas las instancias sin necesidad de expresiones regulares. Esto hace el código más claro y evita errores comunes relacionados con olvidar el flag 'g' en regex.
Mejor Práctica para Reemplazo Global
Usa replaceAll() cuando necesites reemplazar todas las ocurrencias de un string literal. Es más legible que replace() con regex y menos propenso a errores. Solo usa replace() con regex cuando necesites patrones complejos o lógica de reemplazo con callback.
Los métodos replace() y replaceAll() tienen casos de uso específicos según lo que necesites lograr:
- Usa <code>replace()</code> cuando solo necesites cambiar la primera ocurrencia
- Usa <code>replaceAll()</code> para reemplazar todas las instancias de un string literal
- Usa <code>replace()</code> con regex cuando necesites patrones complejos
- Usa <code>replace()</code> con callback para lógica de reemplazo dinámico
- Usa <code>replaceAll()</code> con regex cuando el patrón requiere expresiones regulares
Reemplazo con Expresiones Regulares
Las expresiones regulares (regex) permiten patrones de búsqueda mucho más potentes y flexibles que los strings literales. Puedes buscar patrones complejos, usar grupos de captura, y aplicar flags como 'i' (case-insensitive) para búsquedas que no distinguen mayúsculas de minúsculas.
Este ejemplo muestra varias técnicas avanzadas con regex. El flag 'i' permite búsquedas case-insensitive. El flag 'g' en replace() reemplaza todas las ocurrencias, similar a replaceAll(). Los grupos de captura (...) permiten referenciar partes del patrón en el reemplazo usando $1, $2, etc. Esto es extremadamente útil para reorganizar o transformar patrones complejos.
Uso de Grupos de Captura en Regex
Los grupos de captura (...) en regex permiten extraer partes del patrón y usarlas en el reemplazo. $1 referencia el primer grupo, $2 el segundo, y así sucesivamente. Esto es ideal para reorganizar formatos como fechas, nombres o datos estructurados.
Advertencia: Caracteres Especiales en Regex
Cuando uses regex, ten cuidado con caracteres especiales como ., *, +, ?, ^, $, |, \, (, ), [, ]. Estos tienen significados especiales en regex y deben escaparse con \ si quieres buscarlos literalmente.
Funciones de Reemplazo (Callback)
Tanto replace() como replaceAll() aceptan una función como segundo argumento en lugar de un string de reemplazo. Esta función recibe información sobre cada coincidencia y puede devolver un valor dinámico basado en esa información. Esto permite lógica de reemplazo compleja y personalizada.
Este ejemplo muestra el poder de las funciones de reemplazo. La función callback recibe varios argumentos: la coincidencia completa, los grupos de captura, el índice de la coincidencia, y el string original. Puedes usar esta información para transformar cada coincidencia de manera única. En este caso, alternamos entre mayúsculas y minúsculas basándonos en el índice de la coincidencia.
Argumentos del Callback de Reemplazo
La función callback recibe: 1) La coincidencia completa, 2) Grupos de captura (si hay), 3) Índice de la coincidencia en el string, 4) El string original. Puedes usar estos argumentos para implementar lógica de reemplazo dinámica basada en el contexto de cada coincidencia.
Casos Especiales
Los métodos replace() y replaceAll() tienen comportamientos específicos en situaciones especiales que es importante conocer. Desde el manejo de strings vacíos hasta secuencias especiales en el reemplazo, estos casos edge pueden sorprenderte si no los conoces previamente.
Este ejemplo muestra casos especiales importantes. Puedes eliminar ocurrencias reemplazando con string vacío. El carácter $ en el string de reemplazo es literal cuando usas strings, pero tiene significado especial con regex ($1, $2, $&, $$). Si el patrón no existe, el método devuelve el string original sin errores. Los valores undefined y null se convierten a strings literalmente. El string vacío como patrón tiene comportamiento especial: replace("") inserta al inicio, replaceAll("") inserta entre cada carácter.
Errores Comunes
Aunque replace() y replaceAll() son métodos relativamente simples, hay varios errores comunes que los desarrolladores cometen. Estos errores pueden causar bugs sutiles que son difíciles de detectar, especialmente cuando trabajas con datos del usuario o strings complejos.
Este ejemplo muestra errores típicos y cómo evitarlos. El error más común es usar replace() sin regex esperando que reemplace todas las ocurrencias. Otro error es olvidar que los strings son inmutables y no asignar el resultado. También es importante manejar casos donde el patrón no existe (el método simplemente devuelve el string original sin errores).
Advertencia: replaceAll() y Regex sin Flag 'g'
replaceAll() con una expresión regular requiere que el regex tenga el flag 'g' (global). Si intentas usar replaceAll() con un regex que no tiene el flag 'g', JavaScript lanzará un TypeError. Este es un error común al migrar código de replace() a replaceAll().
Resumen: replace() y replaceAll()
Conceptos principales:
- •replace() reemplaza solo la primera ocurrencia por defecto
- •replaceAll() reemplaza todas las ocurrencias automáticamente
- •Ambos métodos aceptan strings o expresiones regulares como patrón
- •Los strings son inmutables: devuelven un nuevo string modificado
- •Las funciones callback permiten lógica de reemplazo dinámico
- •Los grupos de captura en regex permiten reorganizar patrones
Mejores prácticas:
- •Usa replaceAll() para reemplazo global de strings literales
- •Usa replace() con regex para patrones complejos
- •Asigna siempre el resultado a una variable (strings inmutables)
- •Escapa caracteres especiales en regex cuando los busques literalmente
- •Usa funciones callback para lógica de reemplazo dinámico
- •Verifica que el regex tenga flag 'g' al usar replaceAll()