¡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!