Coincidencias: match() y matchAll()
Aprende a encontrar todas las coincidencias de una expresión regular en un string usando match() y matchAll(), con grupos de captura, iteradores y casos de uso prácticos.
TL;DR - Resumen rápido
- match() devuelve un array o null dependiendo del flag 'g'
- matchAll() siempre devuelve un iterador de coincidencias
- matchAll() requiere que el regex tenga el flag 'g' (global)
- Los grupos de captura permiten extraer subpatrones específicos
- matchAll() es ideal para procesar muchas coincidencias secuencialmente
- Ambos métodos son esenciales para extracción de datos y validación
Introducción a match() y matchAll()
Los métodos match() y matchAll() son herramientas poderosas para buscar y extraer patrones de strings usando expresiones regulares. Mientras que match() ha existido desde las primeras versiones de JavaScript, matchAll() fue introducido en ES2020 para proporcionar una forma más eficiente y flexible de trabajar con múltiples coincidencias.
La diferencia principal radica en cómo retornan los resultados. match() puede devolver un array con información detallada o null, dependiendo de si el regex tiene el flag 'g'. Por otro lado, matchAll() siempre devuelve un iterador que puedes recorrer para procesar cada coincidencia individualmente, lo que es ideal para grandes volúmenes de datos o cuando necesitas lógica compleja de procesamiento.
Diferencia entre Array e Iterador
match() devuelve un array (o null) con todas las coincidencias disponibles inmediatamente. matchAll() devuelve un iterador que genera coincidencias bajo demanda, lo que es más eficiente en memoria cuando trabajas con strings muy largos o muchas coincidencias.
Método match(): Coincidencias Básicas
El método match() busca coincidencias de una expresión regular en un string. Su comportamiento varía significativamente según si el regex tiene el flag 'g' (global). Sin el flag 'g', devuelve información detallada sobre la primera coincidencia, incluyendo grupos de captura y el índice. Con el flag 'g', devuelve un array con todas las coincidencias encontradas.
Este ejemplo muestra los dos comportamientos principales de match(). Sin el flag 'g', obtienes un array con propiedades adicionales como index (posición de la coincidencia), input (string original) y groups (grupos de captura nombrados). Con el flag 'g', obtienes un array simple con todas las coincidencias, sin información adicional sobre cada una.
Advertencia: matchAll() Requiere Flag 'g'
matchAll() requiere que la expresión regular tenga el flag 'g' (global). Si intentas usar matchAll() con un regex sin el flag 'g', JavaScript lanzará un TypeError. Este es un error común al migrar código de match() a matchAll().
Método matchAll(): Iterador de Coincidencias
El método matchAll() devuelve un iterador que genera objetos de coincidencia uno a uno. Este enfoque es más eficiente en memoria cuando trabajas con strings muy largos o muchas coincidencias, ya que no necesitas cargar todas las coincidencias en memoria simultáneamente. El iterador puede ser convertido a un array usando Array.from() o el spread operator [...iterador].
Este ejemplo demuestra cómo usar matchAll() para encontrar todas las coincidencias. El iterador devuelve objetos con la misma estructura que match() sin el flag 'g': cada objeto tiene la coincidencia completa, grupos de captura, índice y el input original. Puedes procesar cada coincidencia individualmente usando un bucle for...of o convertir el iterador a un array.
Mejor Práctica para Extracción de Múltiples Coincidencias
Usa matchAll() cuando necesites procesar muchas coincidencias o cuando el string sea muy largo. El iterador es más eficiente en memoria y te permite aplicar lógica compleja a cada coincidencia individualmente. Solo usa match() con flag 'g' cuando necesites todas las coincidencias de inmediato en un array.
Grupos de Captura
Los grupos de captura son una característica poderosa de las expresiones regulares que permite extraer subpatrones específicos de cada coincidencia. Los grupos se definen usando paréntesis (...) y pueden ser accedidos como propiedades del objeto de coincidencia. También puedes usar grupos nombrados con la sintaxis (?<nombre>...) para hacer el código más legible.
Este ejemplo muestra cómo trabajar con grupos de captura en match() y matchAll(). Los grupos se acceden mediante índices numéricos ([1], [2], etc.) o nombres cuando usas grupos nombrados. matchAll() es especialmente útil con grupos porque te permite procesar cada coincidencia y sus grupos individualmente en un bucle.
Grupos de Captura con Nombre
Los grupos nombrados usando (?<nombre>...) hacen el código más legible y mantenible. En lugar de recordar que [1] es el día y [2] es el mes, puedes usar match.groups.dia y match.groups.mes. Esto es especialmente útil en expresiones regulares complejas con múltiples grupos.
Diferencias Clave
Aunque ambos métodos buscan coincidencias de expresiones regulares, tienen diferencias importantes en su comportamiento, retorno y casos de uso ideales. Entender estas diferencias te permite elegir el método correcto para cada situación.
Este ejemplo compara directamente ambos métodos. match() sin flag 'g' devuelve información detallada sobre la primera coincidencia, mientras que con flag 'g' devuelve un array simple. matchAll() siempre devuelve un iterador con información detallada sobre cada coincidencia. La clave es que matchAll() te da lo mejor de ambos mundos: todas las coincidencias con información detallada.
Advertencia: Compatibilidad con Navegadores Antiguos
matchAll() fue introducido en ES2020 y no está disponible en navegadores antiguos como Internet Explorer. Si necesitas soportar estos navegadores, usa match() con flag 'g' o considera un polyfill. Verifica la compatibilidad antes de usar matchAll() en producción.
Elige el método adecuado según tus necesidades:
- Usa <code>match()</code> sin flag 'g' cuando necesites detalles de la primera coincidencia
- Usa <code>match()</code> con flag 'g' cuando necesites todas las coincidencias en un array simple
- Usa <code>matchAll()</code> cuando necesites todas las coincidencias con detalles
- Usa <code>matchAll()</code> para procesamiento secuencial eficiente de muchas coincidencias
- Usa <code>matchAll()</code> cuando trabajes con grupos de captura en múltiples coincidencias
Casos Especiales
Los métodos match() y matchAll() tienen comportamientos específicos en situaciones especiales que pueden sorprender si no los conoces. Desde el manejo de coincidencias sin resultados hasta iteradores que se consumen, estos casos edge son importantes para evitar bugs.
Este ejemplo muestra casos especiales importantes. match() devuelve null cuando no encuentra coincidencias (no un array vacío), así que usa el patrón || [] para evitar errores. match() con un string lo convierte a regex automáticamente, pero caracteres especiales como $ pueden causar resultados inesperados. matchAll() con un string funciona (se convierte a regex con flag 'g'), pero con regex personalizado requiere el flag 'g'. Los iteradores de matchAll() se consumen después del primer uso - si necesitas reutilizar los resultados, conviértelos a array. Los grupos de captura opcionales pueden ser undefined.
Casos de Uso Prácticos
Los métodos match() y matchAll() son herramientas versátiles con aplicaciones en muchos escenarios del mundo real. Desde extracción de datos de logs hasta validación de formularios, estos métodos simplifican tareas complejas de procesamiento de strings.
Este ejemplo muestra casos de uso prácticos. Extraer datos estructurados como emails, URLs o fechas es una aplicación común. matchAll() es ideal para extraer múltiples instancias del mismo patrón, como todos los emails en un texto. También puedes usar estos métodos para validar que un string cumpla con un formato específico o para extraer componentes específicos de datos estructurados.
Resumen: match() y matchAll()
Conceptos principales:
- •match() devuelve array o null según el flag 'g'
- •matchAll() siempre devuelve un iterador de coincidencias
- •matchAll() requiere que el regex tenga el flag 'g'
- •Los grupos de captura permiten extraer subpatrones específicos
- •Los iteradores son más eficientes en memoria para muchas coincidencias
- •matchAll() fue introducido en ES2020
Mejores prácticas:
- •Usa matchAll() para extracción de múltiples coincidencias con detalles
- •Usa match() sin flag 'g' para detalles de la primera coincidencia
- •Usa match() con flag 'g' para todas las coincidencias en un array simple
- •Usa grupos nombrados para mejor legibilidad en regex complejas
- •Verifica compatibilidad de navegadores antes de usar matchAll()
- •Convierte iteradores a array solo cuando sea necesario