Перейти к содержанию
TextArray

Шпаргалка по регулярным выражениям

Регулярные выражения достаточно компактны, поэтому их синтаксис легче искать, чем запоминать. На этой странице все это представлено на одном экране — классы, квантификаторы, привязки, группы, обход, экранирование и флаги — с рабочим примером для каждой строки.

Его особенностью является JavaScript, который запускается в вашем браузере и который использует тестер регулярных выражений на этом сайте. Большая часть из них идентична в Python, Java, Go и PCRE; там, где варианты расходятся, они расходятся по краям — поддержка просмотра назад, синтаксис именованной группы и то, означает ли \d «цифру ASCII» или «любую цифру Юникода».

Большая часть сюрпризов связана с двумя вещами. Квантификаторы жадны: они берут все, что могут, и возвращают обратно только тогда, когда остальная часть шаблона дает сбой, поэтому <.+> проглатывает два тега, а <.+?> — нет. А чередование связывает слабее всего, поэтому ^a|b$ означает «начинается с a или заканчивается на b» — а это не то, что большинство людей подразумевают, когда пишут это.

Классы персонажей

Сокращения доступны только в формате ASCII, если вы не добавите флаг u и не используете escape-символы свойств Unicode.

СинтаксисЗначениеПример
.Любой символ, кроме разрыва строкиДобавьте флаг s, чтобы он также соответствовал символам новой строки./a.c/"abc" → "abc"
\dЦифра, 0–9/\d+/"order 42" → "42"
\DВсе, что не является цифрой/\D+/"42abc" → "abc"
\wБуква, цифра или подчеркиваниеТолько ASCII — «é» не является \w./\w+/"user_1!" → "user_1"
\WНичего \w не соответствует/\W+/"a++b" → "++"
\sЛюбые пробелы, включая табуляцию и новую строку./\s+/"a \t b" → " \t "
\SЛюбой символ без пробелов/\S+/" hi" → "hi"
[abc]Любой из перечисленных персонажей/[aeiou]/"rhythm and" → "a"
[^abc]Любой персонаж, кроме перечисленных/[^aeiou ]+/"aeiou xyz" → "xyz"
[a-z]Диапазон персонажей/[a-f]+/"zzabcz" → "abc"
\p{L}Любая буква Юникода (нужен флаг u)/\p{L}+/"42 café" → "café"

Кванторы

Все они по умолчанию жадные: берут столько, сколько могут, и отдают только в том случае, если остальная часть шаблона терпит неудачу.

СинтаксисЗначениеПример
*Ноль или больше/ab*/"a" → "a"
+Один или несколько/ab+/"abbb" → "abbb"
?Ноль или единица — делает это необязательным/colou?r/"color" → "color"
{3}Ровно три/\d{3}/"id 12345" → "123"
{2,}Два или более/a{2,}/"aaa" → "aaa"
{2,4}Между двумя и четырьмя/a{2,4}/"aaaaa" → "aaaa"
*?Ленивый — берет как можно меньшеЖадный <.+> проглотит оба тега./<.+?>/"<a><b>" → "<a>"

Якоря и границы

Они соответствуют позиции, а не персонажу, поэтому ничего не потребляют.

СинтаксисЗначениеПример
^Начало строки или строки с флагом m./^a/"abc" → "a"
$Конец строки или строки с флагом m./c$/"abc" → "c"
\bГраница словаЭто то, что останавливает сопоставление «кота» внутри «конкатенации»./\bcat\b/"the cat sat" → "cat"
\BНет границы слова/\Bcat/"concatenate" → "cat"

Группы и чередование

СинтаксисЗначениеПример
(abc)Группа захвата — запоминается на замену/(\d+)-(\d+)/"10-20" → "10-20"
(?:abc)Группировка без захватаИспользуйте это, когда вам нужна только группировка; это сохраняет значимость чисел захвата./(?:ab)+/"abab" → "abab"
(?<name>…)Именованная группа захвата/(?<year>\d{4})/"in 2026" → "2026"
a|bВ любую сторону — чередованиеЧередование имеет самый низкий приоритет: ^a|b$ — это «^a» или «b$», а не «^(a|b)$»./cat|dog/"one dog" → "dog"
\1Обратная ссылка на первую группу/(\w)\1/"letter" → "tt"

осмотр

Утверждения о том, что окружает позицию. Сами по себе они ничему не соответствуют, поэтому их безопасно комбинировать.

СинтаксисЗначениеПример
(?=…)Lookahead — за которым следует это/\d+(?= kg)/"80 kg" → "80"
(?!…)Негативный прогноз — без этого/\d+(?! kg)/"80 lb" → "80"
(?<=…)Lookbehind — предшествует этому/(?<=\$)\d+/"costs $40" → "40"
(?<!…)Негативный просмотр - этому не предшествует/(?<!\$)\b\d+/"about 40" → "40"

Побег

Именно эти двенадцать символов нуждаются в обратной косой черте, чтобы понимать их буквально.

СинтаксисЗначениеПример
\.Буквальная точка/\d\.\d/"v2.5" → "2.5"
\\Буквальная обратная косая черта/\\/"C:\\dir" → "\\"
\nПеревод строки/a\nb/"a\nb" → "a\nb"
\tВкладка/a\tb/"a\tb" → "a\tb"
\uFFFFСимвол по его кодовой точке/\u00e9/"café" → "é"

Флаги

ФлагИмяЗначение
gГлобальныйНайдите каждое совпадение, а не только первое.
iИгнорировать регистрСовпадение независимо от верхнего или нижнего регистра.
mМногострочныйСопоставляет ^ и $ при каждом разрыве строки, а не только в концах строки.
sРасставить все точкиДавайте. линия совпадения тоже разрывается.
uЮникодРассматривает шаблон как кодовые точки и разрешает экранирование свойств \p{…}.
yЛипкийСоответствует только последнему индексу, никогда не выполняет поиск вперед.

FAQ

В чем разница между жадными и ленивыми квантификаторами?
Жадные квантификаторы (*, +, {2,}) соответствуют максимально возможному количеству символов и возвращают символы только в том случае, если остальная часть шаблона не может совпадать. Добавление? делает их ленивыми: они берут как можно меньше и берут больше только тогда, когда их заставляют. В случае «<a><b>» шаблон <.+> возвращает всю строку, а <.+?> возвращает только <a>.
Почему мое слово совпадает с другими словами?
Потому что ничто не закрепляло это. Оберните слово в \b — /\bcat\b/ соответствует «коту» в «кот сидел», но не внутри «объединить». \b соответствует позиции между символом слова и символом, не являющимся словом, поэтому он ничего не потребляет.
Что меняет флаг u?
Это заставляет шаблон работать с кодовыми точками, а не с единицами UTF-16, поэтому один эмодзи считается за один символ, а также позволяет использовать экранирование свойств \p{…}, например \p{L} для «любой буквы». Без него \w и \d останутся только в формате ASCII, поэтому «кафе» не полностью соответствует /\w+/.
Когда мне следует использовать группу без захвата?
Всякий раз, когда вам нужна группировка, а не захваченный текст — (?:ab)+ вместо (ab)+. Захваты немного снижают производительность, но настоящая причина в нумерации: каждая добавляемая вами группа захвата сдвигает номера следующих за ней групп, незаметно разрушая замены, использующие $1 и $2.
Безопасно ли использовать Lookbehind?
В текущих браузерах и Node да — (?<=…) и (?<!…) поддерживаются во всех основных движках с 2018 года. Safari был последним, кто это добавил. Если вы ориентируетесь на очень старые среды выполнения, сначала проверьте; для синтаксиса регулярных выражений нет полифила.