Перейти к содержимому

67. Lookahead & Lookbehind

Иллюстрация к уроку В этом уроке мы разберем мощные инструменты регулярных выражений JavaScript: Lookahead и Lookbehind. Они позволяют искать совпадения, основываясь на том, что идет до или после искомого текста, но не включая эти “окрестности” в само совпадение.

Lookahead и Lookbehind - это “смотри вперед” и “смотри назад” соответственно. Они позволяют проверять, соответствует ли часть строки определенному шаблону, не включая этот шаблон в сам результат поиска. Это называется “zero-width assertions” (утверждения нулевой ширины), потому что они не потребляют символы строки.

Есть два типа:

  • Positive Lookahead (?=pattern): Соответствует, если за текущей позицией в строке следует pattern.
  • Negative Lookahead (?!pattern): Соответствует, если за текущей позицией в строке не следует pattern.
  • Positive Lookbehind (?<=pattern): Соответствует, если перед текущей позицией в строке находится pattern.
  • Negative Lookbehind (?<!pattern): Соответствует, если перед текущей позицией в строке не находится pattern.
// Positive Lookahead: Найти "JavaScript", за которым следует " is awesome"
let str = "JavaScript is awesome. Python is good.";
let regex = /JavaScript(?= is awesome)/;
let result = str.match(regex);
console.log(result); // ["JavaScript", index: 0, input: "JavaScript is awesome. Python is good.", groups: undefined]
// Negative Lookahead: Найти "JavaScript", за которым не следует " is terrible"
str = "JavaScript is awesome. JavaScript is terrible.";
regex = /JavaScript(?! is terrible)/;
result = str.match(regex);
console.log(result); // ["JavaScript", index: 0, input: "JavaScript is awesome. JavaScript is terrible.", groups: undefined]
// Positive Lookbehind: Найти слово, перед которым стоит символ доллара
str = "Цена: $100, $200, 300";
regex = /(?<=\$)(\d+)/g;
result = str.match(regex);
console.log(result); // ["100", "200"]
// Negative Lookbehind: Найти слово, перед которым не стоит символ доллара
str = "Цена: $100, 200, EUR 300";
regex = /(?<!\$)(\d+)/g;
result = str.match(regex);
console.log(result); // ["200", "300"]

Lookahead и Lookbehind очень полезны для валидации данных, форматирования текста и парсинга. Например, их можно использовать для:

  • Валидации паролей: Проверка, что пароль содержит определенное количество символов, хотя бы одну цифру и одну заглавную букву.
  • Форматирования чисел: Добавление запятых в большие числа (например, 1000000 -> 1,000,000).
  • Подсветки синтаксиса: Определение ключевых слов в коде, не затрагивая другие части текста.
  • Парсинга HTML: Извлечение данных из HTML-тегов, не включая сами теги в результат.

Например, фреймворки и библиотеки для работы с текстом, такие как Ace Editor или CodeMirror, часто используют Lookahead и Lookbehind для подсветки синтаксиса.

  • Lookahead и Lookbehind - это zero-width assertions: они не “потребляют” символы.
  • Используйте Positive Lookahead (?=pattern) для поиска совпадений, за которыми следует pattern.
  • Используйте Negative Lookahead (?!pattern) для поиска совпадений, за которыми не следует pattern.
  • Используйте Positive Lookbehind (?<=pattern) для поиска совпадений, перед которыми находится pattern.
  • Используйте Negative Lookbehind (?<!pattern) для поиска совпадений, перед которыми не находится pattern.
  • Они полезны для валидации, форматирования и парсинга данных.