123 lines
4.4 KiB
Markdown
123 lines
4.4 KiB
Markdown
![]() |
---
|
|||
|
id: 587d7dba367417b2b2512ba9
|
|||
|
title: Позитивне і негативне передбачення
|
|||
|
challengeType: 1
|
|||
|
forumTopicId: 301360
|
|||
|
dashedName: positive-and-negative-lookahead
|
|||
|
---
|
|||
|
|
|||
|
# --description--
|
|||
|
|
|||
|
<dfn>Lookaheads</dfn> - це шаблони, які вказують JavaScript заглянути у ваш рядок заздалегідь, щоб перевірити наявність шаблонів далі. Це може бути корисно при пошуку декількох шаблонів на одному рядку.
|
|||
|
|
|||
|
Існує два типи виглядів: <dfn>позитивний огляд</dfn> і <dfn>негативний огляд</dfn>.
|
|||
|
|
|||
|
Позитивне передбачення шукатиме, щоб переконатися, що елемент у шаблоні пошуку є, але насправді не відповідатиме йому. Позитивне передбачення використовується як `(?=...)`, де `...` необхідна частина, яка не збігається.
|
|||
|
|
|||
|
З іншого боку, негативне передбачення буде стежити за тим, щоб елемент в зразку пошуку був відсутній. Негативне передбачення використовується як `(?=...)`, де `...` необхідний шаблон, який не збігається. Решта шаблону повертається, якщо немає негативного передбачення.
|
|||
|
|
|||
|
Lookaheads є трохи заплутаними, але деякі приклади допоможуть вам в цьому.
|
|||
|
|
|||
|
```js
|
|||
|
let quit = "qu";
|
|||
|
let noquit = "qt";
|
|||
|
let quRegex= /q(?=u)/;
|
|||
|
let qRegex = /q(?!u)/;
|
|||
|
quit.match(quRegex);
|
|||
|
noquit.match(qRegex);
|
|||
|
```
|
|||
|
|
|||
|
У результаті використання обох `match`цих викликів ви отримаєте `["q"]`.
|
|||
|
|
|||
|
Більш практичне використання передбачень - перевірка двох або більше шаблонів в одному рядку. Ось (примітивно) проста перевірка пароля, яка шукає від З до 6 символів і принаймні хоча б одне число:
|
|||
|
|
|||
|
```js
|
|||
|
let password = "abc123";
|
|||
|
let checkPass = /(?=\w{3,6})(?=\D*\d)/;
|
|||
|
checkPass.test(password);
|
|||
|
```
|
|||
|
|
|||
|
# --instructions--
|
|||
|
|
|||
|
Для розпізнавання паролів, що більші за 5 символів використовуйте lookaheads у `pwRegex` для пошуку паролів, більших за 5 символів і має дві послідовні цифри.
|
|||
|
|
|||
|
# --hints--
|
|||
|
|
|||
|
Ваш регулярний вираз має використовувати два додатних `lookaheads`.
|
|||
|
|
|||
|
```js
|
|||
|
assert(pwRegex.source.match(/\(\?=.*?\)\(\?=.*?\)/) !== null);
|
|||
|
```
|
|||
|
|
|||
|
Ваш регулярний вираз не повинен збігатися з рядком `astronaut`
|
|||
|
|
|||
|
```js
|
|||
|
pwRegex.lastIndex = 0;
|
|||
|
assert(!pwRegex.test('astronaut'));
|
|||
|
```
|
|||
|
|
|||
|
Ваш регулярний вираз не повинен відповідати рядку `banan1`
|
|||
|
|
|||
|
```js
|
|||
|
pwRegex.lastIndex = 0;
|
|||
|
assert(!pwRegex.test('banan1'));
|
|||
|
```
|
|||
|
|
|||
|
Ваш регулярний вираз повинен збігатися з рядком `bana12`
|
|||
|
|
|||
|
```js
|
|||
|
pwRegex.lastIndex = 0;
|
|||
|
assert(pwRegex.test('bana12'));
|
|||
|
```
|
|||
|
|
|||
|
Ваш отриманий вираз повинен збігатися з рядком `abc123`
|
|||
|
|
|||
|
```js
|
|||
|
pwRegex.lastIndex = 0;
|
|||
|
assert(pwRegex.test('abc123'));
|
|||
|
```
|
|||
|
|
|||
|
Ваш отриманий вираз не повинен збігатися з рядком `12345`
|
|||
|
|
|||
|
```js
|
|||
|
pwRegex.lastIndex = 0;
|
|||
|
assert(!pwRegex.test('12345'));
|
|||
|
```
|
|||
|
|
|||
|
Ваш отриманий вираз повинен збігатися з рядком `8pass99`
|
|||
|
|
|||
|
```js
|
|||
|
pwRegex.lastIndex = 0;
|
|||
|
assert(pwRegex.test('8pass99'));
|
|||
|
```
|
|||
|
|
|||
|
Ваш регулярний вираз не повинен відповідати рядку `1a2bcde`
|
|||
|
|
|||
|
```js
|
|||
|
pwRegex.lastIndex = 0;
|
|||
|
assert(!pwRegex.test('1a2bcde'));
|
|||
|
```
|
|||
|
|
|||
|
Отриманий вираз не повинен відповідати рядку `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})/;
|
|||
|
```
|