116 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | |
| id: 587d7dbb367417b2b2512baa
 | |
| title: Reutiliza patrones usando grupos de captura
 | |
| challengeType: 1
 | |
| forumTopicId: 301364
 | |
| dashedName: reuse-patterns-using-capture-groups
 | |
| ---
 | |
| 
 | |
| # --description--
 | |
| 
 | |
| Digamos que quieres hacer coincidir una palabra que aparece varias veces como la siguiente.
 | |
| 
 | |
| ```js
 | |
| let repeatStr = "row row row your boat";
 | |
| ```
 | |
| 
 | |
| Podrías usar `/row row row/`, pero ¿qué pasa si no conoces la palabra específica que se repite? <dfn>Los grupos de captura</dfn> pueden utilizarse para encontrar subcadenas repetidas.
 | |
| 
 | |
| Los grupos de captura se construyen encerrando entre paréntesis el patrón de expresión regular a capturar. En este caso, el objetivo es capturar una palabra formada por caracteres alfanuméricos, por lo que el grupo de captura será `\w+` encerrado entre paréntesis: `/(\w+)/`.
 | |
| 
 | |
| La subcadena que coincide con el grupo se guarda en una "variable" temporal, a la que se puede acceder dentro de la misma expresión regular utilizando una barra invertida y el número del grupo de captura (por ejemplo, `\1`). Los grupos de captura se numeran automáticamente por la posición de sus paréntesis de apertura (de izquierda a derecha), empezando por el 1.
 | |
| 
 | |
| El siguiente ejemplo encuentra cualquier palabra que aparezca tres veces separada por un espacio:
 | |
| 
 | |
| ```js
 | |
| let repeatRegex = /(\w+) \1 \1/;
 | |
| repeatRegex.test(repeatStr); // Returns true
 | |
| repeatStr.match(repeatRegex); // Returns ["row row row", "row"]
 | |
| ```
 | |
| 
 | |
| El uso del método `.match()` en una cadena devolverá un arreglo con la subcadena coincidente, junto con sus grupos capturados.
 | |
| 
 | |
| 
 | |
| # --instructions--
 | |
| 
 | |
| 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.
 | |
| 
 | |
| # --hints--
 | |
| 
 | |
| Tu expresión regular debe utilizar la clase de caracteres abreviada para los dígitos.
 | |
| 
 | |
| ```js
 | |
| assert(reRegex.source.match(/\\d/));
 | |
| ```
 | |
| 
 | |
| Tu expresión regular debe reutilizar un grupo de captura dos veces.
 | |
| 
 | |
| ```js
 | |
| assert(reRegex.source.match(/\\1|\\2/g).length >= 2);
 | |
| ```
 | |
| 
 | |
| Tu expresión regular debe coincidir con la cadena `42 42 42`.
 | |
| 
 | |
| ```js
 | |
| reRegex.lastIndex = 0;
 | |
| assert(reRegex.test('42 42 42'));
 | |
| ```
 | |
| 
 | |
| Tu expresión regular debe coincidir con la cadena `100 100 100`.
 | |
| 
 | |
| ```js
 | |
| reRegex.lastIndex = 0;
 | |
| assert(reRegex.test('100 100 100'));
 | |
| ```
 | |
| 
 | |
| Tu expresión regular no debe coincidir con la cadena `42 42 42 42`.
 | |
| 
 | |
| ```js
 | |
| assert.equal('42 42 42 42'.match(reRegex.source), null);
 | |
| ```
 | |
| 
 | |
| Tu expresión regular no debe coincidir con la cadena `42 42`.
 | |
| 
 | |
| ```js
 | |
| assert.equal('42 42'.match(reRegex.source), null);
 | |
| ```
 | |
| 
 | |
| Tu expresión regular no debe coincidir con la cadena `101 102 103`.
 | |
| 
 | |
| ```js
 | |
| reRegex.lastIndex = 0;
 | |
| assert(!reRegex.test('101 102 103'));
 | |
| ```
 | |
| 
 | |
| Tu expresión regular no debe coincidir con la cadena `1 2 3`.
 | |
| 
 | |
| ```js
 | |
| reRegex.lastIndex = 0;
 | |
| assert(!reRegex.test('1 2 3'));
 | |
| ```
 | |
| 
 | |
| Tu expresión regular debe coincidir con la cadena `10 10 10`.
 | |
| 
 | |
| ```js
 | |
| reRegex.lastIndex = 0;
 | |
| assert(reRegex.test('10 10 10'));
 | |
| ```
 | |
| 
 | |
| # --seed--
 | |
| 
 | |
| ## --seed-contents--
 | |
| 
 | |
| ```js
 | |
| let repeatNum = "42 42 42";
 | |
| let reRegex = /change/; // Change this line
 | |
| let result = reRegex.test(repeatNum);
 | |
| ```
 | |
| 
 | |
| # --solutions--
 | |
| 
 | |
| ```js
 | |
| let repeatNum = "42 42 42";
 | |
| let reRegex = /^(\d+)\s\1\s\1$/;
 | |
| let result = reRegex.test(repeatNum);
 | |
| ```
 |