123 lines
3.1 KiB
Markdown
123 lines
3.1 KiB
Markdown
---
|
|
id: 587d7dba367417b2b2512ba9
|
|
title: Lookahead positivo y negativo
|
|
challengeType: 1
|
|
forumTopicId: 301360
|
|
dashedName: positive-and-negative-lookahead
|
|
---
|
|
|
|
# --description--
|
|
|
|
Los <dfn>lookaheads</dfn> son patrones que le indican a JavaScript que busque por anticipado en tu cadena para verificar patrones más adelante. Esto puede ser útil cuando deseas buscar varios patrones sobre la misma cadena.
|
|
|
|
Hay dos tipos de lookaheads: <dfn>lookahead positivo</dfn> y <dfn>lookahead negativo</dfn>.
|
|
|
|
Un lookahead positivo buscará para asegurarse de que el elemento en el patrón de búsqueda este allí, pero en realidad no lo coincidirá. Un lookahead positivo se usa como `(?=...)` donde el `...` es la parte requerida que no coincide.
|
|
|
|
Por otro lado, un lookahead negativo buscará para asegurarse de que el elemento en el patrón de búsqueda no este allí. Un lookahead negativo se usa como `(?!...)` donde el `...` es el patrón que no quieres que esté allí. El resto del patrón se devuelve si la parte de lookahead negativo no está presente.
|
|
|
|
Los lookaheads son un poco confusos, pero algunos ejemplos ayudarán.
|
|
|
|
```js
|
|
let quit = "qu";
|
|
let noquit = "qt";
|
|
let quRegex= /q(?=u)/;
|
|
let qRegex = /q(?!u)/;
|
|
quit.match(quRegex);
|
|
noquit.match(qRegex);
|
|
```
|
|
|
|
Ambas llamadas a `match` devolverán `["q"]`.
|
|
|
|
Un uso más práctico de lookaheads es comprobar dos o más patrones en una cadena. Aquí hay un verificador de contraseñas (ingenuamente) simple que busca entre 3 y 6 caracteres y al menos un número:
|
|
|
|
```js
|
|
let password = "abc123";
|
|
let checkPass = /(?=\w{3,6})(?=\D*\d)/;
|
|
checkPass.test(password);
|
|
```
|
|
|
|
# --instructions--
|
|
|
|
Utiliza los lookaheads en el `pwRegex` para que coincida con las contraseñas que tengan más de 5 caracteres y dos dígitos consecutivos.
|
|
|
|
# --hints--
|
|
|
|
Tu expresión regular debe usar dos `lookaheads` positivos.
|
|
|
|
```js
|
|
assert(pwRegex.source.match(/\(\?=.*?\)\(\?=.*?\)/) !== null);
|
|
```
|
|
|
|
Tu expresión regular no debe coincidir con la cadena `astronaut`
|
|
|
|
```js
|
|
pwRegex.lastIndex = 0;
|
|
assert(!pwRegex.test('astronaut'));
|
|
```
|
|
|
|
Tu expresión regular no debe coincidir con la cadena `banan1`
|
|
|
|
```js
|
|
pwRegex.lastIndex = 0;
|
|
assert(!pwRegex.test('banan1'));
|
|
```
|
|
|
|
Tu expresión regular debe coincidir con la cadena `bana12`
|
|
|
|
```js
|
|
pwRegex.lastIndex = 0;
|
|
assert(pwRegex.test('bana12'));
|
|
```
|
|
|
|
Tu expresión regular debe coincidir con la cadena `abc123`
|
|
|
|
```js
|
|
pwRegex.lastIndex = 0;
|
|
assert(pwRegex.test('abc123'));
|
|
```
|
|
|
|
Tu expresión regular no debe coincidir con la cadena `12345`
|
|
|
|
```js
|
|
pwRegex.lastIndex = 0;
|
|
assert(!pwRegex.test('12345'));
|
|
```
|
|
|
|
Tu expresión regular debe coincidir con la cadena `8pass99`
|
|
|
|
```js
|
|
pwRegex.lastIndex = 0;
|
|
assert(pwRegex.test('8pass99'));
|
|
```
|
|
|
|
Tu expresión regular no debe coincidir con la cadena `1a2bcde`
|
|
|
|
```js
|
|
pwRegex.lastIndex = 0;
|
|
assert(!pwRegex.test('1a2bcde'));
|
|
```
|
|
|
|
Tu expresión regular debe coincidir con la cadena `astr1on11aut`
|
|
|
|
```js
|
|
pwRegex.lastIndex = 0;
|
|
assert(pwRegex.test('astr1on11aut'));
|
|
```
|
|
|
|
# --seed--
|
|
|
|
## --seed-contents--
|
|
|
|
```js
|
|
let sampleWord = "astronaut";
|
|
let pwRegex = /change/; // Change this line
|
|
let result = pwRegex.test(sampleWord);
|
|
```
|
|
|
|
# --solutions--
|
|
|
|
```js
|
|
let pwRegex = /(?=\w{6})(?=\w*\d{2})/;
|
|
```
|