Перейти до основного вмісту
Модуль 6 · Урок 1 із 421/32 у курсі~10 min
Модульні уроки (1/4)

Позитивний перегляд: `(?=...)`

Позитивний прогноз (?=...) є твердженням нульової ширини: він перевіряє, чи певний шаблон відповідає поточній позиції, але ** не використовувати** ці символи.

Code
Pattern: \d+(?= euro)
Sample:  Prezzo 100 euro, sconto 25 euro, totale 75 dollari.
                ^^^                 ^^

Попередній перегляд (?= euro) вимагає, щоб за цифрами слідував euro, але збіг включає лише цифри. 75 dollari не збігається (ні euro).

Чому "нульова ширина"

Подумайте про прогноз як про умову на посаді, а не як про частина матчу:

  • Матч зупиняється до перегляду вперед.
  • Позиція «після матчу» є початком тексту, перевіреного пошуком вперед.
  • Наступна спроба матчу з прапором g продовжиться з цього моменту.

Це робить його ідеальним для вилучення значень без їх контексту: цін без валюти, слова перед розділовим знаком тощо.

Функції Lookahead і сканування нульової ширини

Позитивний попередній перегляд (?=...) гарантує, що вказаний шаблон відповідає поточній точці, але сканування поновлюється з позиції перед попереднім переглядом. Це запобігає «використанню» частин тексту, які можуть знадобитися для наступних збігів.

Спробуйте

вправи#regex.m6.l1.e1
Спроби: 0Завантаження…

Витягніть ТІЛЬКИ цифри цін у євро (послідовність цифр, за якою йде «євро»). У матчі немає валюти.

Завантаження редактора…
Показати підказку

Перемістіть «євро» всередину попереднього перегляду (?= євро): рядок не буде частиною збігу.

Рішення доступне після 3 спроб

Повторна вправа

вправи#regex.m6.l1.e2
Спроби: 0Завантаження…

Знайдіть кожне слово, після якого стоїть двокрапка `:` (але без двокрапки у відповідності).

Завантаження редактора…
Показати підказку

Та сама логіка: `:` не в матчі, але це умова позиції.

Рішення доступне після 3 спроб

Додатковий виклик

вправи#regex.m6.l1.e3
Спроби: 0Завантаження…

Find every word (e.g. function name) followed immediately by an open parenthesis `(`, excluding the parenthesis from the match.

Завантаження редактора…
Показати підказку

Перемістіть \\( (розкриті круглі дужки) всередину позитивного перегляду вперед (?=...).

Рішення доступне після 3 спроб