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);
|
|
```
|