Открыть сервис

регулярное выражение

Регулярное выражение (также регулярное выражение, шаблон, regex, regexp) — это формальный язык, используемый для поиска, замены и манипуляции подстрок в тексте на основе заданного шаблона. Регулярные выражения представляют собой последовательность символов, задающую правило, которому должна соответствовать искомая строка или её часть. Они широко применяются в программировании, обработке текстов, администрировании систем и лингвистике.

История

Идея регулярных выражений восходит к работам американского математика Стивена Клини, который в 1951 году ввёл понятие «регулярных событий» в контексте теории автоматов. В 1956 году Клини опубликовал статью, формализовавшую регулярные выражения как способ описания регулярных языков. В 1960-х годах, с развитием компьютерных наук, концепция была адаптирована для практического использования в текстовых редакторах и утилитах.

Первым широко известным программным инструментом, реализовавшим регулярные выражения, стал редактор ed в операционной системе Unix (1969 год). В 1970-х годах Кен Томпсон включил поддержку регулярных выражений в утилиту grep. В 1980-х годах язык Perl, разработанный Ларри Уоллом, значительно расширил возможности регулярных выражений, добавив такие конструкции, как обратные ссылки, ленивые квантификаторы и модификаторы. С тех пор регулярные выражения стали стандартным компонентом многих языков программирования, включая Python, Java, JavaScript, C# и Ruby.

Основные понятия

Символы и литералы

Регулярное выражение состоит из обычных символов (литералов) и метасимволов. Литералы обозначают сами себя: например, шаблон abc соответствует строке «abc». Метасимволы имеют специальное значение и задают классы символов, квантификаторы, границы или группы.

Классы символов

Классы символов позволяют задать набор символов, один из которых должен совпасть. Например:

  • [abc] — соответствует любому из символов a, b или c.
  • [a-z] — соответствует любой строчной букве латинского алфавита.
  • [^0-9] — соответствует любому символу, кроме цифр.
  • \d — соответствует любой цифре (эквивалент [0-9]).
  • \w — соответствует любой букве, цифре или знаку подчёркивания (эквивалент [a-zA-Z0-9_]).
  • \s — соответствует любому пробельному символу (пробел, табуляция, перевод строки).

Квантификаторы

Квантификаторы определяют количество повторений предшествующего элемента:

  • * — ноль или более раз.
  • + — один или более раз.
  • ? — ноль или один раз.
  • {n} — ровно n раз.
  • {n,} — n или более раз.
  • {n,m} — от n до m раз включительно.

По умолчанию квантификаторы являются «жадными» — они захватывают максимально возможную строку. Для получения «ленивого» поведения (минимальное совпадение) после квантификатора ставится знак ? (например, *?).

Якоря

Якоря задают позицию в строке, а не символ:

  • ^ — начало строки.
  • $ — конец строки.
  • \b — граница слова.
  • \B — позиция, не являющаяся границей слова.

Группировка и обратные ссылки

Круглые скобки () используются для группировки частей выражения и захвата совпадений. Захваченные группы могут быть использованы в дальнейшем поиске или замене через обратные ссылки (например, \1 для первой группы). Некоторым группам можно присвоить имя с помощью синтаксиса (?<name>...).

Альтернация

Символ | обозначает логическое «ИЛИ»: cat|dog соответствует строке «cat» или «dog».

Применение

Поиск и замена в текстовых редакторах

Регулярные выражения встроены в большинство современных текстовых редакторов и IDE (например, Visual Studio Code, Sublime Text, Vim). Они позволяют выполнять сложный поиск, например, найти все email-адреса или заменить определённые шаблоны.

Валидация данных

Регулярные выражения часто используются для проверки формата вводимых данных: email, номер телефона, IP-адрес, дата, пароль. Например, шаблон ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ проверяет корректность email-адреса.

Обработка логов и системное администрирование

Утилиты grep, sed, awk в Unix-подобных системах используют регулярные выражения для фильтрации и обработки текстовых файлов, логов, конфигураций.

Лингвистика и корпусная лингвистика

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

Разновидности и диалекты

Регулярные выражения не имеют единого стандарта. Существует несколько основных диалектов, отличающихся синтаксисом и возможностями:

  • POSIX Basic Regular Expressions (BRE) — базовая версия, используемая в утилитах grep (без флага -E), sed. Метасимволы ?, +, {, |, (, ) должны экранироваться обратной косой чертой.
  • POSIX Extended Regular Expressions (ERE) — расширенная версия, используемая в grep -E, awk. Метасимволы не требуют экранирования.
  • Perl Compatible Regular Expressions (PCRE) — наиболее мощный и популярный диалект, разработанный в Perl. Включает ленивые квантификаторы, обратные ссылки, условные конструкции, просмотры вперёд и назад. PCRE реализован в библиотеках для многих языков программирования.
  • Регулярные выражения в Python — основаны на PCRE, но с некоторыми отличиями (например, поддержка именованных групп через (?P<name>...)).
  • Регулярные выражения в JavaScript — также близки к PCRE, но имеют ограниченную поддержку обратных ссылок и просмотров.

Критика и ограничения

Регулярные выражения критикуются за низкую читаемость и сложность отладки. Длинные и сложные шаблоны могут быть трудны для понимания и модификации. Кроме того, регулярные выражения не подходят для разбора контекстно-свободных грамматик (например, HTML или XML), хотя для простых задач их часто используют.

Существуют также проблемы с производительностью: некоторые шаблоны могут приводить к экспоненциальному времени выполнения (так называемый «катастрофический возврат»), что может быть использовано для атак типа ReDoS (Regular Expression Denial of Service).

Интересные факты

  • Регулярные выражения впервые были реализованы в редакторе ed в 1969 году.
  • Утилита grep получила своё название от команды g/re/p (global regular expression print).
  • В 2020 году в языке Perl была добавлена поддержка Unicode-свойств, что расширило возможности работы с текстами на разных языках.
  • Существуют онлайн-инструменты для тестирования и отладки регулярных выражений, такие как regex101.com и RegExr.

Источники

  • Клини С. «Representation of Events in Nerve Nets and Finite Automata» (1956)
  • Фридл Дж. «Регулярные выражения» (3-е издание, 2006)
  • Спецификация PCRE (pcre.org)
  • Документация Python по модулю re (docs.python.org)
  • Документация JavaScript по объекту RegExp (developer.mozilla.org)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →