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

Lookahead и Lookbehind

Понимание продвинутых тем регулярных выражений JavaScript полезно любому разработчику, стремящемуся улучшить свои навыки программирования. Среди более продвинутых и мощных возможностей в этой области — утверждения lookahead и lookbehind. Эти утверждения позволяют разработчикам искать шаблоны в тексте, не включая эти шаблоны в результат. Это руководство призвано подробно рассмотреть утверждения lookahead и lookbehind в JavaScript, с множеством практических примеров.

WARNING

Регулярные выражения могут быть непростыми, и могут существовать крайние случаи. Особенно когда вы используете такие продвинутые концепции, как Lookahead и Lookbehind. Используйте онлайн-тестеры регулярных выражений или пишите модульные тесты, чтобы проверять ваши выражения на различных сценариях ввода и убедиться, что они работают ожидаемым образом.

Введение в утверждения Lookahead и Lookbehind

Утверждения lookahead и lookbehind — это утверждения нулевой ширины, то есть они сопоставляют позицию внутри строки, а не сами символы. Они позволяют нам проверять, существует ли заданный шаблон или не существует ли он в определённой точке строки. Примечание: современные движки JavaScript (ES2018+) поддерживают утверждения lookbehind переменной длины, хотя в некоторых старых средах могут требоваться шаблоны фиксированной длины.

Положительный Lookahead

Положительное утверждение lookahead проверяет наличие определённого шаблона впереди текущей позиции в строке. Оно обозначается как (?=...). В следующем примере показан положительный lookahead для поиска слова "apple", за которым следует слово "pie":

Javascript regexp lookaround corresponds to characters

Output appears here after Run.

Отрицательный Lookahead

Отрицательное утверждение lookahead проверяет отсутствие определённого шаблона впереди текущей позиции. Оно обозначается как (?!...). В следующем примере показан отрицательный lookahead для поиска слова "apple", за которым не следует слово "pie":

Javascript regexp the negative lookahead

Output appears here after Run.

Положительный Lookbehind

Положительное утверждение lookbehind проверяет наличие определённого шаблона позади текущей позиции в строке. Оно обозначается как (?<=...). Ниже приведён пример кода для поиска слова "pie", перед которым стоит слово "apple":

Javascript regexp the positive lookbehind

Output appears here after Run.

Отрицательный Lookbehind

Отрицательное утверждение lookbehind проверяет отсутствие определённого шаблона позади текущей позиции. Оно обозначается как (?<!...). Вот пример для поиска слова "pie", перед которым не стоит слово "apple":

Lookahead and Lookbehind

Output appears here after Run.

Практическое применение Lookahead и Lookbehind

Проверка надёжности пароля

Обеспечение надёжности паролей — распространённое требование в веб-приложениях. Утверждения lookahead можно использовать для проверки различных условий пароля без потребления символов.


Output appears here after Run.

В этом примере мы проверили пароль, который должен содержать как минимум одну заглавную букву, одну строчную букву, одну цифру и один специальный символ.

Форматирование и разбор данных

Утверждения lookahead и lookbehind могут помочь при форматировании и разборе сложных структур данных. Хороший пример — вставка запятых в строку чисел для удобства чтения:


Output appears here after Run.

Заключение

Освоение утверждений lookahead и lookbehind в JavaScript может значительно повысить вашу способность обрабатывать и анализировать строки. Эти мощные инструменты обеспечивают гибкость проверки шаблонов без потребления символов, что делает их незаменимыми для сложных задач обработки текста. Используя эти утверждения, разработчики могут создавать более эффективные и действенные регулярные выражения, что ведёт к более чистому и поддерживаемому коду.

Практика

Какие из следующих утверждений о lookahead и lookbehind в JavaScript верны?

Считаете ли это полезным?

Предпросмотр dual-run — сравните с маршрутами Symfony на продакшене.