Перейти к основному содержимому
Модуль 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.

Это делает его идеальным для извлечения значений без их контекста: цен. без валюты, слов перед знаками препинания и т. д.

Функции просмотра вперед и сканирование нулевой ширины

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

Попробуйте это

Упражнение#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 попыток