Регуля́рные выраже́ния (англ. regular expressions) — формальный язык, используемый в компьютерных программах, работающих с текстом, для поиска и осуществления манипуляций с подстроками в тексте, основанный на использовании метасимволов (символов-джокеров, англ. wildcard characters). Для поиска используется строка-образец (англ. pattern, по-русски её часто называют «шаблоном», «маской»), состоящая из символов и метасимволов и задающая правило поиска. Для манипуляций с текстом дополнительно задаётся строка замены, которая также может содержать в себе специальные символы.
 Регулярные выражения используются некоторыми текстовыми редакторами и утилитами для поиска и подстановки текста. Например, при помощи регулярных выражений можно задать шаблоны, позволяющие:
 Регулярные выражения позволяют задавать и гораздо более сложные шаблоны поиска или замены.
 Результатом работы с регулярным выражением может быть:
 Если регулярное выражение используется для замены текста, то результатом работы будет новая текстовая строка, представляющая собой исходный текст, из которого удалены найденные подстроки (сопоставленные образцу), а вместо них подставлены строки замены (возможно, модифицированные запомненными при разборе группами символов из исходного текста). Частным случаем модификации текста является удаление всех вхождений найденного образца — для чего строка замены указывается пустой.
 Набор утилит (включая редактор sed и фильтр grep), поставляемых в дистрибутивах UNIX, одним из первых способствовал популяризации регулярных выражений для обработки текстов. Многие современные языки программирования имеют встроенную поддержку регулярных выражений. Среди них Perl, Java,PHP, JavaScript, языки платформы .NET Framework, Python, Tcl, Ruby, Lua, Gambas, C++ (стандарт 2011 года), Delphi, D, Haxe и другие.
 Истоки регулярных выражений лежат в теории автоматов, теории формальных языков и классификации формальных грамматик по Хомскому.
 Эти области изучают вычислительные модели (автоматы) и способы описания и классификации формальных языков.
В 1940-х гг. Уоррен Маккалок и Уолтер Питтс описали нейронную систему, используя простой автомат в качестве модели нейрона.
 Математик Стивен Клини позже описал эти модели, используя свою систему математических обозначений, названную «регулярные множества».
 Кен Томпсон встроил их в редактор QED, а затем — в редактор ed под UNIX.
С этого времени регулярные выражения стали широко использоваться в UNIX и UNIX-подобных утилитах, например в expr, awk, Emacs, vi, lex и Perl.
 Регулярные выражения в Perl и Tcl происходят от реализации, написанной Генри Спенсером.
Филип Хейзел разработал библиотеку PCRE (англ. Perl-compatible regular expressions — Perl-совместимые регулярные выражения), которая используется во многих современных инструментах, таких как PHP и Apache[источник не указан 1675 дней].
 Регулярные выражения состоят из констант и операторов, которые определяют множества строк и множества операций на них соответственно.
Определены следующие константы:
 и следующие операции:
 Регулярные выражения, входящие в современные языки программирования (в частности, PCRE), имеют больше возможностей, чем то, что называется регулярными выражениями в теории формальных языков; в частности, в них есть нумерованные обратные ссылки. Это позволяет им разбирать строки, описываемые не только регулярными грамматиками, но и более сложными, в частности, контекстно-свободными грамматиками.
 Большинство символов в регулярном выражении представляет само себя за исключением специальных символов
[
]
\
/
^
$
.
|
?
*
+
(
)
{
}
(в разных типах регулярных выражений этот набор различается, см. Разновидности регулярных выражений),
которые могут быть экранированы символом \ (обратная косая черта) для представления самих себя в качестве символов текста.
Можно экранировать целую последовательность символов, заключив её между \Q и \E.
 Аналогично могут быть представлены другие специальные символы (наборы символов, требующих экранирования, могут различаться в зависимости от конкретной реализации).
Часть символов, которые в той или иной реализации не требуют экранирования (например, угловые скобки < >), может быть экранирована из соображений удобочитаемости.
 Метасимвол . (точка) означает один любой символ, но в некоторых реализациях — исключая символ новой строки.
 Вместо символа . можно использовать  (все пробельные и непробельные символы, включая символ новой строки).
 Набор символов в квадратных скобках [ ] именуется символьным классом и позволяет указать интерпретатору регулярных выражений, что на данном месте в строке может стоять один из перечисленных символов.
В частности,  задаёт возможность появления в тексте одного из трёх указанных символов, а  задаёт соответствие одной из цифр.
Возможно указание диапазонов символов: например,  соответствует всем буквам русского алфавита, за исключением букв «Ё» и «ё». Некоторые реализации регулярных выражений могут позволять включать в символьные классы не только символы, но и целые строки.
 Если требуется указать символы, которые не входят в указанный набор, то используют символ ^ внутри квадратных скобок, например  означает любой символ, кроме цифр.
 Добавление в набор специальных символов путём экранирования — самый бесхитростный способ. Однако в современных регулярных выражениях унаследован также и традиционный подход — см. Традиционные регулярные выражения.
 Некоторые символьные классы можно заменить специальными метасимволами:
 Пример: Выражение вида ^\S.* или ^[^ \f\n\r\t\v].* будет находить строки, начинающиеся с непробельного символа
 Пример: Выражение вида \w+ будет находить и выделять отдельные слова
 Следующие символы позволяют спозиционировать регулярное выражение относительно элементов текста: начала и конца строки, границ слова.
 \n — перевод строки
 \r — возврат каретки
 Круглые скобки используются для определения области действия и приоритета операций.
Шаблон внутри группы обрабатывается как единое целое и может быть квантифицирован.
Например, выражение (тр[ау]м-?)* найдёт последовательность вида трам-трам-трумтрам-трум-трамтрум.
 Вертикальная черта разделяет допустимые варианты.
Например, gray|grey соответствует gray или grey.
Следует помнить, что перебор вариантов выполняется слева направо, как они указаны.
 Если требуется указать перечень вариантов внутри более сложного регулярного выражения, то его нужно заключить в группу.
Например, gray|grey или gr(a|e)y описывают строку gray или grey.
В случае с односимвольными альтернативами предпочтителен вариант gr[ae]y, так как сравнение с символьным классом выполняется проще, чем обработка группы с проверкой на все её возможные модификаторы и генерацией обратной связи.
 Квантификатор после символа, символьного класса или группы определяет, сколько раз предшествующее выражение может встречаться.
Следует учитывать, что квантификатор может относиться более чем к одному символу в регулярном выражении, только если это символьный класс или группа.
 Часто используется последовательность .* для обозначения любого количества любых символов между двумя частями регулярного выражения.
 Символьные классы в сочетании с квантификаторами позволяют устанавливать соответствия с реальными текстами.
Например, столбцами цифр, телефонами, почтовыми адресами, элементами HTML-разметки и др.
 Если символы
{
}
не образуют квантификатора, их специальное значение игнорируется.
 Выражение (<.*>) соответствует строке, содержащей несколько тегов HTML-разметки, целиком.
 <p><b>Википедия</b> — свободная энциклопедия, в которой <i>каждый</i> может изменить или дополнить любую статью.</p>
 Чтобы выделить отдельные теги, можно применить ленивую версию этого выражения:
(<.*?>)
Ей соответствует не вся показанная выше строка, а отдельные теги (выделены цветом):
 <p><b>Википедия</b> — свободная энциклопедия, в которой <i>каждый</i> может изменить или дополнить любую статью.</p>
 В некоторых реализациях квантификаторам в регулярных выражениях соответствует максимально длинная строка из возможных (квантификаторы являются жадными, англ. greedy).
Это может оказаться значительной проблемой.
Например, часто ожидают, что выражение (<.*>) найдёт в тексте теги HTML.
Однако если в тексте есть более одного HTML-тега, то этому выражению соответствует целиком строка, содержащая множество тегов.
 <p><b>Википедия</b> — свободная энциклопедия, в которой <i>каждый</i> может изменить или дополнить любую статью.</p>
 Эту проблему можно решить двумя способами.
 Использование ленивых квантификаторов может повлечь за собой обратную проблему, когда выражению соответствует слишком короткая, в частности, пустая строка.
 Также общей проблемой как жадных, так и ленивых выражений являются точки возврата для перебора вариантов выражения.
Точки ставятся после каждой итерации квантификатора.
Если интерпретатор не нашёл соответствия после квантификатора, то он начинает возвращаться по всем установленным точкам, пересчитывая оттуда выражение по-другому.
 При поиске выражения

(a+a+)+a

в строке aaaaa интерпретатор пойдёт приблизительно по следующему пути:
 При использовании ревнивого квантификатора будет выполнен только первый шаг алгоритма.
 В отличие от обычной (жадной) квантификации, ревнивая (possessive) квантификация не только старается найти максимально длинный вариант, но ещё и не позволяет алгоритму возвращаться к предыдущим шагам поиска для того, чтобы найти возможные соответствия для оставшейся части регулярного выражения.
 Использование ревнивых квантификаторов увеличивает скорость поиска, особенно в тех случаях, когда строка не соответствует регулярному выражению. Кроме того, ревнивые квантификаторы могут быть использованы для исключения нежелательных совпадений.
 Это аналогично атомарной группировке.
 Одно из применений группировки — повторное использование ранее найденных групп символов (подстрок, блоков, отмеченных подвыражений, захватов).
При обработке выражения подстро́ки, найденные по шаблону внутри группы, сохраняются в отдельной области памяти и получают номер, начиная с единицы. Каждой подстроке соответствует пара скобок в регулярном выражении.
 Обычно поддерживается до 9 нумерованных подстрок с номерами от 1 до 9, но некоторые интерпретаторы позволяют работать с бо́льшим количеством.
Впоследствии в пределах данного регулярного выражения можно использовать обозначения от \1 до \9 для проверки на совпадение с ранее найденной подстрокой. В некоторых реализациях вместо бэкслеша используется знак доллара.
 Например, регулярное выражение (та|ту)-\1 найдёт строку та-та или ту-ту, но пропустит строку та-ту.
 Квантификация группы трактуется как многократное сохранение подстроки под одним и тем же номером, то есть запоминается последнее вхождение: например, регулярное выражение (.)+\1 найдёт строку abcc, но пропустит abca.
 Также ранее найденные подстро́ки можно использовать при замене по регулярному выражению.
В таком случае в замещающий текст вставляются те же обозначения, что и в пределах самого выражения.
 Если группа используется только для группировки и её результат в дальнейшем не потребуется, то можно использовать группировку вида (?:шаблон).
Под результат такой группировки не выделяется отдельная область памяти и, соответственно, ей не назначается номер.
Это положительно влияет на скорость выполнения выражения, но понижает удобочитаемость.
 Атомарная группировка вида (?>шаблон) так же, как и группировка без обратной связи, не создаёт обратных связей.
В отличие от неё, такая группировка запрещает возвращаться назад по строке, если часть шаблона уже найдена.
 abccaxcc
 abccaxcc
 но не abccaxcc: вариант x найден, остальные проигнорированы
 Атомарная группировка выполняется ещё быстрее, чем группировка без обратной связи, и сохраняет процессорное время при выполнении остального выражения, так как запрещает проверку любых других вариантов внутри группы, когда один вариант уже найден.
Это очень полезно при оптимизации групп со множеством различных вариантов.
 Это аналогично ревнивой квантификации.
 Модификаторы действуют с момента вхождения и до конца регулярного выражения или противоположного модификатора.
Некоторые интерпретаторы могут применить модификатор ко всему выражению, а не с момента его вхождения.
 Группы-модификаторы можно объединять в одну группу: (?i-sm).
Такая группа включает режим i и выключает режимы s и m.
Если использование модификаторов требуется только в пределах группы, то нужный шаблон указывается внутри группы после модификаторов и после двоеточия.
Например, (?-i)(?i:tv)set найдёт TVset, но не TVSET.
 Для добавления комментариев в регулярное выражение можно использовать группы-комментарии вида (?#комментарий).
Такая группа интерпретатором полностью игнорируется и не проверяется на вхождение в текст.
Например, выражение А(?#тут комментарий)Б соответствует строке АБ.
 В большинстве реализаций регулярных выражений есть способ производить поиск фрагмента текста, «просматривая» (но не включая в найденное) окружающий текст, который расположен до или после искомого фрагмента текста.
Просмотр с отрицанием используется реже и «следит» за тем, чтобы указанные соответствия, напротив, не встречались до или после искомого текстового фрагмента.
 Во многих реализациях регулярных выражений существует возможность выбирать, по какому пути пойдёт проверка в том или ином месте регулярного выражения на основании уже найденных значений.
 В некоторых языках (например, в JavaScript) реализованы т. н. «флаги», которые расширяют функции RegExp. Флаги указываются после регулярного выражения (порядок флагов значения не имеет). Типичные флаги:
 Флаг указывается после паттерна, например, вот так: /[0-9]$/m.
 (англ. basic regular expressions (BRE)). Традиционные регулярные выражения UNIX. Синтаксис базовых регулярных выражений на данный момент определён POSIX'ом как устаревший, но он до сих пор широко распространён из соображений обратной совместимости.
Многие UNIX-утилиты используют такие регулярные выражения по умолчанию.
 В данную версию включены метасимволы:
 Особенности:
 (англ. extended regular expressions (ERE)). Синтаксис в основном аналогичен традиционному.
 Perl-совместимые регулярные выражения (англ. Perl-compatible regular expressions (PCRE)) имеют более богатый синтаксис, чем даже POSIX ERE.
По этой причине очень многие приложения используют именно Perl-совместимый синтаксис регулярных выражений.
 Unicode — это набор символов, целью которого является определение всех символов и символов со всех человеческих языков, живых и мёртвых. Регулярные выражения, рассчитанные на множество языков, таким образом не привязываются к конкретным наборам символов, а описывают их согласно принятым правилам. Так, например, выражение для нахождения заглавных букв в любом алфавите будет выглядеть так: /\p{Lu}/.
 В некоторых случаях регулярные выражения удобно применить для анализа текстовых фрагментов на естественном языке, то есть написанных людьми, и, возможно, содержащих опечатки либо нестандартные варианты употреблений слов. Например, если проводить опрос (допустим, на веб-сайте) «какой станцией метро вы пользуетесь», может оказаться, что «Невский проспект» посетители могут указать как:
 Здесь обычные регулярные выражения неприменимы, в первую очередь из-за того, что входящие в образцы слова могут совпадать не очень точно (нечётко), но, тем не менее, было бы удобно описывать регулярными выражениями структурные зависимости между элементами образца, например в нашем случае указать, что совпадение может быть с образцом «Невский проспект» ИЛИ «Канал Грибоедова», притом «проспект» может быть сокращено до «пр» или отсутствовать, а перед «Канал» может находиться сокращение «наб.».
 Эта задача сродни полнотекстовому поиску, отличаясь в том, что здесь короткий фрагмент должен сравниваться с набором образцов, а при полнотекстовом поиске, наоборот, образец обычно один, в то время как фрагмент текста очень большой, или задаче разрешения лексической многозначности, которая, однако, не позволяет задать структурирующие отношения между элементами образца.
 Существует небольшое количество библиотек, реализующих механизм регулярных выражений с возможностью нечёткого сравнения: