регулярное выражение¶
Регулярное выражение (также регулярное выражение, шаблон, 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 →


