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

Регулярные выражения в информатике

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

История

Математическая теория регулярных языков была заложена Стивеном Клини в 1956 году в работе о конечных автоматов и алгебраических теориях. В 1962 году Кеннетом Томпсоном реализован алгоритм компиляции регулярных выражений в конечные автоматы, применённый в текстовом редакторе QED. Томпсон стал соавтором утилиты grep (1973), название которой происходит от команды «global regular expression print».

В 1986 году в системе UNIX появился утилитный набор awk, а в 1987 году Ларри Уолл выпустил Perl, в котором регулярные выражения получили развитый синтаксис с обратными ссылками и поддержкой захвата групп. Этот набор функций стал основой для POSIX-стандартов (BRE и ERE) и впоследствии для PCRE (Perl Compatible Regular Expressions) — библиотеки, скопированной во многие языки и системы.

Основные элементы

Синтаксис регулярных выражений включает литеральные символы и метасимволы:

ЭлементОписание
.любой один символ (кроме перевода строки в большинстве диалектов)
*ноль или более повторений предыдущего элемента
+один или более повторений
?ноль или один повтор
^, $начало и конец строки
[abc]символьный класс — любой из указанных символов
(abc)группа — объединение элементов, захват подстроки
\d, \w, \sцифра, буква/цифра/подчёркивание, пробельный символ

Пример: шаблон ^\d{3}-\d{2}-\d{4}$ описывает строки формата «123-45-6789» — номер социального страхования США, часто используемый как учебный пример валидации.

Виды и стандарты

Различают несколько основных диалектов:

  • BRE (Basic Regular Expressions) — классический синтаксис утилит grep и sed в UNIX; группировка задаётся через \(\), а квантификаторы + и ? требуют экранирования.
  • RESE / ERE (Extended Regular Expressions) — расширенный синтаксис с группировкой () и прямыми квантификаторами, поддерживается grep -E.
  • PCRE — совместимый с Perl набор функций, включает ленивые квантификаторы, lookahead/lookbehind, рекурсивные шаблоны.
  • RE2 — библиотека Google, гарантирующая линейное время работы за счёт отказа от обратных ссылок и lookahead; используется в ClickHouse, CockroachDB и других системах.

Алгоритмы и сложность

Поиск регулярного выражения в тексте выполняется либо интерпретацией шаблона как конечного автомата (метод Томпсона, время O(n·m) для текста длины n и шаблона длины m), либо обратным сопоставлением (backtracking). Backtracking-движки (Perl, Python, JavaScript) поддерживают расширенные конструкции, но в худшем случае демонстрируют экспоненциальное время работы — эффект, известный как «катаклизм регулярных выражений» (ReDoS). Известны примеры, когда шаблон вида (a+)+b на строке из десятков символов «a» без завершающего «b» приводит к многоминутной задержке.

Применение

Регулярные выражения встроены в большинство языков программирования: Python (модуль re), JavaScript (RegExp), Java (java.util.regex), C# (System.Text.RegularExpressions), Go (пакет regexp с движком RE2). В операционных системах они используются в утилитах grep, sed, awk, find, в текстовых редакторах (Vim, Emacs, Sublime Text) для поиска и замены.

В веб-разработке регулярные выражения применяются для валидации форм (адреса электронной почты, номера телефонов, почтовые индексы), разбора логов, извлечения данных из HTML/XML. Поисковые системы и СУБД используют расширения регулярных языков: PostgreSQL поддерживает POSIX-синтаксис в операторе ~, MySQL — собственный диалект в REGEXP.

В естественных науках и биоинформатике регулярные выражения применяются для поиска мотивов в последовательностях ДНК и белков; для этих задач разработаны специализированные расширения (PROSITE, regular expressions с допуском несоответствий).

Ограничения

Классические регулярные выражения описывают только регулярные языки и неспособны к счёту вложенных скобок — задача вида «найти сбалансированные скобки» не решается стандартным regex. Для таких задач используются парсеры или контекстно-свободные грамматики. Кроме того, сложность чтения сложных регулярных выражений привела к появлению термина «write-only language» — шаблон, который его автор способен понять только в момент написания.

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

В 2023 году исследователи продемонстрировали, что на современных браузерах выполнение вредоносного регулярного выражения способно заблокировать основной поток выполнения JavaScript на десятки секунд, что стало основанием для включения ReDoS в список OWASP Top 10 для API.

Источники:

  • Клини С. «Введение в теорию автоматов, языки и вычислений»
  • Фридл Д. «Regular Expressions Cookbook»
  • Документация POSIX.1-2017, раздел «Regular Expression Notation»
  • Russ Cox, «Regular Expression Matching Can Be Simple And Fast» (2007)
  • Документация библиотеки RE2 (Google)
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru