67. Lookahead & Lookbehind
JavaScript: Мозги. Урок: Lookahead & Lookbehind
Заголовок раздела «JavaScript: Мозги. Урок: Lookahead & Lookbehind»
В этом уроке мы разберем мощные инструменты регулярных выражений JavaScript: Lookahead и Lookbehind. Они позволяют искать совпадения, основываясь на том, что идет до или после искомого текста, но не включая эти “окрестности” в само совпадение.
Что такое Lookahead и Lookbehind?
Заголовок раздела «Что такое 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. - Они полезны для валидации, форматирования и парсинга данных.