Avatar ·

¿Cómo acceder a los grupos coincidentes en una expresión regular de JavaScript?

¡Hola a todos! Soy nuevo en JavaScript y estoy trabajando con expresiones regulares. Tengo una cadena, por ejemplo, `"Hoy es 25.12.2023"`, y quiero extraer el día, mes y año por separado. Escribí este código: ```javascript let str = "Hoy es 25.12.2023"; let regex = /(\d{2})\.(\d{2})\.(\d{4})/; let result = regex.exec(str); console.log(result); ``` En la consola veo un array, pero no entiendo cómo obtener exactamente el día, mes y año. Probé escribir `result[1]`, `result[2]`, `result[3]` — funciona, pero me parece que no es muy conveniente. Además, si uso `str.match(regex)`, el resultado es diferente cuando no hay coincidencias. Expliquen, por favor, ¿cómo acceder correctamente a los grupos de captura en JavaScript? ¿En qué casos usar `exec()` y en cuáles `match()`? ¿Y se puede dar nombres a los grupos para no confundirme con los índices? Agradeceré un análisis detallado con ejemplos. <<>>

Fundamentos del trabajo con grupos de captura en JavaScript

En las expresiones regulares de JavaScript, los grupos de captura se definen con paréntesis `()`. El método `exec()` devuelve un array donde el primer elemento es la coincidencia completa, y los siguientes son los grupos capturados en orden. Por ejemplo, con `result[1]` obtienes el día, `result[2]` el mes y `result[3]` el año. Aunque funciona, puede ser confuso con muchos grupos. Para mayor claridad, puedes usar grupos con nombre (named capturing groups) con la sintaxis `(?...)`, disponible desde ES2018. Así, puedes acceder a ellos mediante `result.groups.nombre`. Por ejemplo: ```javascript let regex = /(?\d{2})\.(?\d{2})\.(?\d{4})/; let result = regex.exec(str); console.log(result.groups.day); // "25" console.log(result.groups.month); // "12" console.log(result.groups.year); // "2023" ``` En cuanto a `exec()` vs `match()`: `exec()` es más flexible, ya que permite iterar sobre múltiples coincidencias con el flag `g` (global) y proporciona información adicional como el índice. `match()` sin el flag `g` devuelve un array similar a `exec()`, pero con el flag `g` devuelve solo las coincidencias completas sin grupos. Si no hay coincidencia, `exec()` devuelve `null`, mientras que `match()` también devuelve `null`. Recomiendo `exec()` para control detallado y `match()` para casos simples sin grupos. ¡Espero que esto te ayude!