Expresiones regulares - Reutiliza patrones usando grupos de captura

Hola a todos.
Estoy en el jercicio 31 donde pide: Utiliza los grupos de captura en reRegex para que coincida con una cadena que conste sólo del mismo número repetido exactamente tres veces separado por espacios.

Utilicé la expresión “/(\d+) \1 \1/” y me da el error de que no cumple con la condición " Tu expresión regular no debe coincidir con la cadena ‘42 42 42 42’"
Es decir, si hay más de 3 repeticiones del mismo número debería exceptuarlo y no lo hace.
Seguramente sea algo simple, pero no encontré qué es.
Si puede ayudarme alguien lo agradezco mucho.

let repeatNum = "42 42 42";
let reRegex = /(\d+) \1 \1/; // Cambia esta línea
let result = reRegex.test(repeatNum);

Información de tu navegador:

El agente de usuario es: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36

Challenge: Expresiones regulares - Reutiliza patrones usando grupos de captura

Enlaza al desafío:

Hola Marcelo,

A mí me volvió loco la parte de regular expresions. (Me acuerdo de este ejercicio, me encontré en la misma situación).
Me he ayudado de chat gpt para hacerte una respuesta entendible, ya que hasta a mí me ha costado entender por qué pasaba esto otra vez :sweat_smile:

Ahí va:
La razón por la que la expresión regular coincide con la cadena “42 42 42 42” es que cada grupo de captura “\1” en la expresión regular hace referencia al mismo grupo de dígitos capturado previamente, que es “42” en este caso. Por lo tanto, la expresión regular busca exactamente tres repeticiones de la misma secuencia “42” separadas por espacios en blanco.

Aquí está el proceso de coincidencia paso a paso:

  1. La expresión regular comienza con “\d+”, que coincide con uno o más dígitos. En este caso, coincide con “42”.
  2. Luego, la expresión regular busca un espacio en blanco después de la secuencia de dígitos.
  3. A continuación, la expresión regular encuentra “\1”, que es una referencia al primer grupo de captura. El primer grupo de captura, que es “(\d+)”, capturó previamente la secuencia de dígitos “42”.
  4. La referencia “\1” busca una coincidencia de la misma secuencia de dígitos que se encontró en el primer grupo de captura, que es “42” en este caso.
  5. Después, la expresión regular busca otro espacio en blanco.
  6. La expresión regular encuentra nuevamente “\1”, que busca otra coincidencia de la misma secuencia de dígitos “42” que se encontró en el primer grupo de captura.
  7. El proceso se repite una vez más, ya que la cadena “42 42 42 42” tiene exactamente tres repeticiones de la secuencia “42” separadas por espacios en blanco.

Como resultado, la cadena “42 42 42 42” cumple con todos los criterios de la expresión regular, por lo que se considera una coincidencia válida.

Dicho de otra forma:
La expresión regular “/(\d+) \1 \1/” busca una secuencia de dígitos (\d+) seguida de un espacio en blanco, luego busca exactamente dos repeticiones adicionales de la misma secuencia de dígitos, separadas por espacios en blanco.

Por ejemplo, en la cadena “42 42 42 42”, la expresión regular busca una secuencia de dígitos “42”, seguida de un espacio en blanco. Luego busca dos repeticiones más de “42” separadas por espacios en blanco. Como “42 42 42 42” cumple con estos criterios, es una coincidencia válida.

Lo sé, te explota la cabeza :exploding_head:.
Entonces ahora, si entiendes por qué pasa esa expresión, entonces el truco estará en añadirle un par de condiciones más.
Que si no se te ocurren puedes ver en la primera solución. :face_with_monocle:

Ánimo! :wink:

Muchísimas gracias por tu respuesta. De verdad que con expresiones regulares me trabé muchísimo.
Al final había que limitar la cantidad de repeticiones, fui probando la separación con el espacio escribiendo \s pero no era necesario.
Quedó así: /^(\d{2,}) \1 \1$/

Busca una cadena que comienza al principio de la línea, contiene dos o más dígitos seguidos de un espacio, seguido de una repetición exacta del primer conjunto de dígitos, otro espacio y una segunda repetición exacta del primer conjunto de dígitos, y termina al final de la línea.

:melting_face:

:wink:
Simplemente usando ^ y $ indicando que empiece por y acabe en.
Solventabas el problema.

Al no indicar el inicio y el final estaba cogiendo una coincidencia más al final, por esto (\d+) (espacio).

Esta solución también funciona: /^(\d+) \1 \1$/
La segunda solución que te dan es la de: /^(\d+) \1 \1(?!.)/
(?!.) => Indica que al final no haya ningún otro carácter a excepción del salto de línea.

De todas formas dan mucho juego las expresiones regulares dando lugar a muchas combinaciones.

:saluting_face: