Шпаргалка по регулярным выражениям: Синтаксис, флаги и частые шаблоны
Быстрый ответ
Regex объединяет literal characters, metacharacters (., \d, \w, \s), quantifiers (*, +, ?, {n,m}), anchors (^, $, \b) и groups ((...), [...]). Flags вроде g (global), i (case-insensitive), m (multiline) меняют поведение match. Тестируйте live нашим Regex Tester.
Введение
Regular expressions (regex) описывают текстовые паттерны компактным формальным языком. Поддерживаются каждым современным языком программирования, редактором и search tool. Этот cheat sheet — справочник синтаксиса, определённого ECMAScript, плюс распространённые паттерны. Используйте наш Regex Tester для тестирования паттернов.
Шаг за шагом
-
Классы символов — соответствуют набору символов.
[abc] соответствует a, b или c. [^abc] соответствует чему угодно, кроме a, b, c. [a-z] соответствует любой строчной букве. Предопределенные классы: \d = [0-9], \D = нецифра, \w = [A-Za-z0-9_], \W = не слово, \s = пробел, \S = непробел, . = любой символ, кроме новой строки (используйте флаг s, чтобы включить новую строку).
-
Квантификаторы — сколько раз повторять
* = 0 или более. + = 1 или более. ? = 0 или 1. {n} = ровно n. {n,} = не менее n. {n,m} = между n и m. Добавлять ? для ленивого сопоставления (например, *? соответствует как можно меньшему количеству совпадений). Жадный режим используется по умолчанию и может привести к катастрофическому возврату во вложенных шаблонах.
-
Якоря и границы – где сопоставлять
^ соответствует началу строки (или строки с флагом m). $ соответствует концу. \b соответствует границе слова (между \w и \W). \B соответствует границе, отличной от слова. Якоря имеют нулевую ширину — они проверяют положение, не потребляя символы.
-
Группы и чередование
(abc) — захватывающая группа; используйте 1, 2 доллара в качестве замены. (?:abc) — группа без захвата. (?=abc) — это просмотр вперед (утверждает следующее). (?!abc) — это отрицательный прогноз. (?<=abc) — просмотр назад (ES2018+). a|b — чередование (a или b).
-
Флаги — изменение поведения сопоставления
g = global (найти все совпадения, а не только первое). я = регистронезависимо. m = многострочный (^ и $ соответствуют границам строк). s = dotAll (. соответствует новой строке). u = unicode (рассматривайте шаблон как кодовые точки Unicode; необходимо для эмодзи и астральных символов). y = липкий (соответствует только последнему индексу).
Примеры
Сопоставьте адрес электронной почты (практично, упрощенный RFC 5322).
Вход: Pattern: /^[^\s@]+@[^\s@]+\.[^\s@]+$/
Выход: Соответствует «user@example.com» и «a.b@sub.domain.co», но не «plainaddress» или «@no-user.com».
Извлеките все шестнадцатеричные коды цветов из CSS.
Вход: Pattern: /#[0-9a-fA-F]{3,8}\b/g
Выход: In 'color: #fff; background: #1a2b3c4d' finds ['#fff', '#1a2b3c4d']
Подтвердите дату ISO 8601 (ГГГГ-ММ-ДД)
Вход: Pattern: /^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$/
Выход: Соответствует «2026-08-28», но отклоняет «2026-13-01» и «2026-02-31».
Замените цифры на #, используя группу захвата.
Вход: «Заказ 42 отправлен» заменен на /(\d+)/g →'#$1'
Выход: «Заказ №42 отправлен»
Распространенные проблемы
- Жадные квантификаторы совпадают слишком сильно: '<.*>' в '<a><b>' соответствует всей строке '<a><b>' вместо '<a>'. Используйте '<.*?>' (ленивый), чтобы сначала сопоставить '<a>'.
- Катастрофический возврат: вложенные квантификаторы типа (a+)+b на вводе «аааааааааааааа!» может занять экспоненциальное время. Перепишите шаблон или используйте атомарные группы/притяжательные кванторы, где это поддерживается.
- Если забыть флаг u для Юникода: /^.$/ соответствует одной кодовой единице, поэтому эмодзи типа «😀» (две кодовые единицы) не работают без флага u. Всегда добавляйте u при сопоставлении астральных персонажей.
- Путаница \b (граница слова) с \s (пробелы): \b соответствует слову и символу, не являющемуся словом, поэтому он работает и в начале/конце строки. \s соответствует только реальным символам пробелов.
Советы
- Всегда проверяйте регулярное выражение как на совпадающих, так и на несовпадающих образцах в нашем тестере регулярных выражений, прежде чем встраивать его в рабочий код — крайние случаи легко пропустить.
- Предпочитайте классы символов [a-z] вместо чередования (a|b|...|z) для отдельных символов — классы работают быстрее и понятнее.
- Используйте группы без захвата (?:...), если вам не нужны захваченные значения — захват требует небольших затрат производительности и загромождает массив результатов.
- Компилируйте регулярное выражение один раз с помощью new RegExp() или литерала в области модуля, а не внутри горячего цикла — перекомпиляция одного и того же шаблона на каждой итерации тратит ресурсы процессора.