Regular Expressions или RegExp могут быть одним из самых мощных инструментов в наборе программиста. В статье рассказываем, что такое регулярные выражения, как их использовать и делимся полезными ссылками.
Блог студии web-разработки YuSMP Group содержит много полезной информации от ведения проекта до разбора технологий веб-разработки. Если не нашли ответа на свой вопрос, обратитесь к нам любым удобным способом: здесь оставили контакты.
Кратко (TL;DR). Регулярное выражение (RegExp) — это шаблон для описания вида текста, а не конкретной строки: пара символов вроде ^, *, [a-z] заменяет сотни ручных проверок. Разбираем синтаксис, спецсимволы, жадные и ленивые квантификаторы, группы захвата и даём готовые шаблоны для email, телефона и URL.
Краткий обзор
Регулярные выражения — это последовательность символов, определяющую шаблон поиска. RegExp возникли в 1950-х годах, когда Стивен Коул Клини описал идею, которую назвал «регулярным языком», часть которой стала известна как «теорема Клини». На очень высоком уровне говорится, что если элементы языка могут быть определены, то выражение может быть написано для сопоставления шаблонов в этом языке.
С тех пор регулярные выражения стали частью даже самых ранних программ Unix, включая vi, sed, awk, grep и другие. На самом деле слово grep происходит от команды, которая использовалась в самом раннем редакторе «ed», а именно g/re/p, что означает «выполнить глобальный поиск этого регулярного выражения и вывести строки».
Можно сказать, что регулярные выражения — это еще один язык, который специализируется на описании шаблонов строк.
В разных языковых средах, регулярные выражения JS, PHP, JAVA, .NET будут примерно одинаковыми без существенных различий.
Как упоминалось выше, RegExp используются для определения шаблона, чтобы помочь сопоставить или «найти» объекты, соответствующие этому шаблону. Объектами могут быть файлы в системе при использовании find команды или блок текста в файле, который мы можем искать, используя grep, awk, vi или sed.
Начните с основ
Начнем с самого начала. Когда-нибудь хотели распечатать список файлов в каталоге, но он был слишком длинным? Возможно, вы видели, как кто-то вводил список изображений GIF в каталоге, например:
$ ls *.gif
Это регулярное выражение, пример простой и наглядный.
При написании некоторые символы имеют особое значение, позволяющее перейти от сопоставления только символов к сопоставлению целых наборов символов. В этом случае * символ, также называемый wildcard, заменяет имена файлов и позволяет сопоставлять все файлы, оканчивающиеся на .gif.
Специальные символы и метасимволы
Каждая строка — это уже Regular Expressions. Во всех языках, включая C++, регулярные выражения чувствительны к регистру: “спасибо” и “Спасибо” будут считываться как разные значения.
Еще важно следить за специальными символами:
^ $ * + ? { } [ ] | ( )
При экранировании JAVA нужно добавить перед каждым знаком.
| Символ | Значение | Пример |
|---|---|---|
. | Любой символ, кроме перевода строки | a.c → «abc», «axc» |
^ | Начало строки | ^Simple → строка начинается с «Simple» |
$ | Конец строки | test$ → строка заканчивается на «test» |
[ ] | Класс символов — один из перечисленных | [aeiou] → любая гласная |
[^ ] | Отрицание класса — любой символ, кроме перечисленных | [^0-9] → не цифра |
\d \w \s | Цифра, «словесный» символ, пробел | \d{3} → три цифры подряд |
| | Логическое «или» (альтернация) | cat|dog → «cat» или «dog» |
( ) | Группа — выделяет часть шаблона | (ab)+ → «ab», «abab»… |
\ | Экранирование спецсимвола | \. → буквальная точка, а не «любой символ» |
Совет. Если нужно найти спецсимвол буквально, а не как оператор regex, экранируйте его обратным слешем: 3\.14 найдёт «3.14», а не «3» + любой символ + «14».
Квантификаторы: жадные и ленивые
Квантификатор указывает, сколько раз должен повториться предыдущий символ или группа. Без квантификатора выражение ищет ровно одно совпадение символа.
| Квантификатор | Значение | Пример |
|---|---|---|
* | 0 или больше раз | ab* → «a», «ab», «abbb» |
+ | 1 или больше раз | ab+ → «ab», «abbb», но не «a» |
? | 0 или 1 раз (необязательный символ) | colou?r → «color» и «colour» |
{n} | Ровно n раз | \d{4} → ровно 4 цифры |
{n,m} | От n до m раз | \d{2,4} → от 2 до 4 цифр |
По умолчанию квантификаторы «жадные» — захватывают максимально длинную подстроку, которая подходит под шаблон. Если добавить ? после квантификатора, он становится «ленивым» и захватывает минимально возможный фрагмент.
Разница хорошо видна на HTML-подобной строке <b>жирный</b> и <b>ещё раз</b>. Жадный шаблон <b>.*</b> захватит всё — от первого <b> до самого последнего </b>, включая текст между тегами. Ленивый шаблон <b>.*?</b> остановится на ближайшем закрывающем теге и вернёт только «жирный».
Частая ошибка. Жадный квантификатор в HTML- или XML-подобном тексте захватывает лишнее — от первого открывающего тега до последнего закрывающего, а не до ближайшего. Если нужен именно ближайший фрагмент, используйте ленивую версию с ?.
Группы и запоминание совпадений
Круглые скобки ( ) создают группу — часть шаблона, которую можно переиспользовать или извлечь отдельно от остального совпадения.
- Группа захвата
(abc)— запоминает найденный фрагмент под номером по порядку открывающей скобки. - Именованная группа
(?<year>\d{4})— то же самое, но с читаемым именем вместо номера; удобно, когда групп много. - Обратная ссылка
\1(или\k<year>) — ссылается на то, что уже нашла группа. Полезно для поиска повторов:\b(\w+)\s+\1\bнайдёт «привет привет». - Группа без захвата
(?:abc)— группирует для квантификатора или альтернации, но не сохраняет совпадение в списке результатов — быстрее и не засоряет вывод.
Пример именованных групп в JavaScript:
const m = "2026-09-30".match(/(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/);
m.groups.year; // "2026"
m.groups.month; // "09"
Флаги: как менять режим поиска
Флаг — буква после самого шаблона, которая меняет поведение поиска целиком, а не одну его часть.
| Флаг | Значение |
|---|---|
g | Глобальный поиск — найти все совпадения, а не только первое |
i | Игнорировать регистр — «Тест» и «тест» совпадают |
m | Многострочный режим — ^ и $ работают на каждой строке, а не только в начале/конце всего текста |
s | «Точка» . дополнительно совпадает с переводом строки |
В JavaScript флаги указывают после закрывающего слеша: /тест/gi найдёт все вхождения «тест» без учёта регистра.
Поиск шаблонов в файле
Следующим шагом в обучении регулярным выражениям sql и в других языках является поиск шаблонов в файле, особенно использование шаблона замены для быстрого внесения изменений.
Два распространенных способа сделать это:
- Используйте vi, чтобы открыть файл, найти шаблон и внести изменения (даже автоматически с помощью замены).
- Используйте «редактор потока», также известный как sed, для программного поиска в файле и внесения изменений.
Давайте начнем с изучения некоторых JS RegExp, используя vi для редактирования следующего файла:
Быстрая коричневая лиса перепрыгнула через ленивого пса.
Простой тест
Более сложный тест
Экстремальный тест
ABC 123 abc 567
Собака ленива
Теперь, когда этот файл открыт, давайте посмотрим на некоторые примеры, которые помогут найти некоторые совпадающие строки внутри и даже автоматически заменить их.
Чтобы упростить задачу, настроим vi на игнорирование регистра. Введите set ic, чтобы включить поиск без учета регистра.
Теперь, чтобы начать поиск в vi, введите /символ, за которым следует шаблон поиска.
Поиск вещей в начале или конце строки
Чтобы найти строку, начинающуюся с «Simple», используйте следующий шаблон регулярного выражения linux или другой языковой среды:
/^Simple
Обратите внимание, что на изображении ниже выделена только строка, начинающаяся с «Simple». Карет ( ^) это начало строки
Далее давайте воспользуемся $ символом, который означает конец строки.
/test$
Видите, как он выделяет обе строки, заканчивающиеся на «тест»? Также обратите внимание, что в четвертой строке есть слово test, но не в конце, поэтому эта строка не выделена.
В этом заключается сила RegExp, дающая возможность быстро и легко просматривать большое количество совпадений, но в частности детализировать только точные совпадения.
Как составить регулярное выражение: 5 шагов
Проще всего собирать регулярное выражение не сразу целиком, а по шагам — от словесного описания задачи к готовому шаблону.
- Сформулируйте задачу словами. Например: «строка должна начинаться с буквы, дальше — цифры и дефисы, всего 6–10 символов».
- Разбейте на кусочки-условия. Начало строки →
^, буква →[a-zA-Z], цифры и дефисы →[0-9-], длина остатка → квантификатор{n,m}. - Соберите шаблон по частям:
^[a-zA-Z][0-9-]{5,9}$. - Проверьте на реальных примерах — и на тех, что должны совпасть, и на тех, что должны быть отклонены, особенно граничные случаи по длине.
- Протестируйте в онлайн-инструменте вроде Regex101 (см. раздел «Полезные сервисы» ниже) — он подсвечивает совпадения и объясняет каждую часть шаблона.
Готовые примеры регулярных выражений
Ниже — рабочие шаблоны для самых частых практических задач.
| Задача | Регулярное выражение | Пример совпадения |
|---|---|---|
^[\w.+-]+@[\w-]+\.[a-zA-Z]{2,}$ | user.name@example.com | |
| Телефон РФ | ^\+?7[\s-]?\(?\d{3}\)?[\s-]?\d{3}[\s-]?\d{2}[\s-]?\d{2}$ | +7 (800) 511-32-27 |
| URL | ^https?:\/\/[\w.-]+\.[a-z]{2,}(\/\S*)?$ | https://yusmpgroup.ru/blog |
| Дата (ДД.ММ.ГГГГ) | ^\d{2}\.\d{2}\.\d{4}$ | 03.10.2022 |
| Почтовый индекс РФ | ^\d{6}$ | 630005 |
Важно. Эти шаблоны — рабочая отправная точка, а не готовый продакшн-валидатор. Для email и телефонов в проде лучше дополнительно проверять адрес отправкой кода подтверждения — регулярка не отличит существующий адрес от опечатки в домене.
Полезные сервисы
- RegExr, Regexpal или Regex101 — чтобы протестировать или просто потренироваться.
- Regexper строит диаграммы, которые помогут разобраться с существующими RegExp.
- Визуальные конструкторы функций: RegExp Builder для JavaScript. Debuggex для PCRE, JavaScript или Python.
У вас есть проект, который хотели бы обсудить? Возможно, веб-услуги и разработка в YuSMP Group помогут реализовать задуманное. Посмотрите кейсы YuSMP Group, чтобы убедиться в профессионализме студии. Оставьте заявку на сайте или свяжитесь удобным способом — наши менеджеры ответят и проконсультируют вас.
Итог
Регулярные выражения экономят десятки строк ручного кода, если освоить пять вещей: спецсимволы и классы (^, $, [ ], \d), квантификаторы и разницу между жадным и ленивым поведением, группы захвата, флаги режима поиска и привычку сразу проверять шаблон в тестере вроде Regex101, а не в проде. Дальше — вопрос практики: чем больше реальных задач вы решаете через RegExp, тем быстрее шаблон складывается в голове без подглядывания в шпаргалку.
Частые вопросы (FAQ)
Что такое регулярное выражение простыми словами?
Это шаблон, которым описывают вид текста, а не конкретную строку — например, «буква, затем 5 цифр» вместо перечисления всех подходящих значений. Программа сравнивает шаблон со строкой и определяет, совпадает она или нет.
Чем отличаются регулярные выражения в JavaScript, PHP и Python?
Базовый синтаксис — спецсимволы, квантификаторы, группы — практически одинаковый везде, потому что все они восходят к одному семейству стандартов. Отличаются детали: способ объявления шаблона в коде (/pattern/ в JS, функции preg_* в PHP, модуль re в Python) и отдельные флаги.
Что означают спецсимволы ^ и $ в регулярном выражении?
^ обозначает начало строки, $ — конец строки. Вместе ^abc$ означают «строка целиком равна abc», а не «содержит abc где-то внутри».
В чём разница между жадным и ленивым квантификатором?
Жадный квантификатор (по умолчанию) захватывает максимально длинный подходящий фрагмент. Ленивый — с добавленным ? — захватывает минимально возможный. В тексте с несколькими похожими фрагментами жадный вариант часто захватывает лишнее.
Как проверить регулярное выражение перед использованием в коде?
Через онлайн-тестер вроде Regex101 или RegExr — они подсвечивают совпадения в реальном времени и по частям объясняют, как читается шаблон.
Регулярные выражения подходят для парсинга HTML?
Для простых точечных задач — да, но для полноценного разбора HTML-документа лучше использовать специализированный парсер: вложенность тегов регулярка описывает плохо, а сложные шаблоны быстро становятся нечитаемыми.
Нужны разработчики в команду?
Подберём инженеров нужного стека под ваш проект — быстрый старт.




