Регулярные выражения
Регулярное выражение (сокращенно regex) позволяет разработчикам сопоставлять строки с шаблоном, извлекать информацию о подсовпадениях или просто проверять, соответствует ли строка этому шаблону. Регулярные выражения используются во многих языках программирования, а синтаксис JavaScript вдохновлен Perl.
Рекомендуется прочитать руководство по регулярным выражениям, чтобы получить обзор доступных синтаксисов регулярных выражений и принципов их работы.
Описание
Регулярные выражения — важная концепция в теории формальных языков. Это способ описания потенциально бесконечного множества строковых последовательностей символов (называемого языком). Регулярное выражение, по своей сути, требует следующих элементов:
- Набор символов, которые могут использоваться в языке, называемый алфавитом.
-
Конкатенация:
abозначает "символa, за которым следует символb". -
Объединение:
a|bозначает "либоa, либоb". -
Звезда Клини:
a*означает "ноль или более символовa".
При условии конечного алфавита (например, 26 букв английского алфавита или весь набор символов Unicode) все регулярные языки могут быть сгенерированы с помощью вышеперечисленных элементов. Конечно, многие шаблоны очень утомительны для выражения таким образом (например, "10 цифр" или "символ, который не является пробелом"), поэтому регулярные выражения JavaScript включают множество сокращений, представленных ниже.
Примечание: Регулярные выражения JavaScript на самом деле не являются регулярными из-за существования обратных ссылок (регулярные выражения должны иметь конечные состояния). Однако они по-прежнему являются очень полезной функцией.
Создание регулярных выражений
Регулярное выражение обычно создается как литерал путем заключения шаблона в прямые косые черты (/):
const regex1 = /ab+c/g;
Регулярные выражения также можно создавать с помощью конструктора RegExp():
const regex2 = new RegExp("ab+c", "g");
Они не имеют различий во время выполнения, хотя могут иметь последствия для производительности, статической анализируемости и удобства использования при экранировании символов. Для получения дополнительной информации см. RegExp.
Флаги регулярных выражений
Флаги — это специальные параметры, которые могут изменить способ интерпретации регулярного выражения или его взаимодействие с входным текстом. Каждый флаг соответствует одному свойству доступа в объекте RegExp.
| Флаг | Описание | Соответствующее свойство |
|---|---|---|
d | Генерировать индексы для совпадений подстрок. | hasIndices |
g | Глобальный поиск. | global |
i | Поиск без учета регистра. | ignoreCase |
m | Заставляет ^ и $ соответствовать началу и концу каждой строки, а не всей строки. | multiline |
s | Позволяет . соответствовать символам новой строки. | dotAll |
u | "Unicode"; обрабатывать шаблон как последовательность кодовых точек Unicode. | unicode |
v | Улучшение режима u с дополнительными функциями Unicode. | unicodeSets |
y | Выполнять "липкий" поиск, который начинается с текущей позиции в целевой строке. | sticky |
Флаги i, m и s могут быть включены или отключены для конкретных частей регулярного выражения с помощью синтаксиса модификатора.
В разделах ниже перечислены все доступные синтаксисы регулярных выражений, сгруппированные по их синтаксической природе.
Утверждения
Утверждения — это конструкции, которые проверяют, удовлетворяет ли строка определенному условию в указанной позиции, но не потребляют символы. Утверждения не могут быть квантифицированы.
-
Утверждение границы буфера:
\A,\z,\Z - Утверждает, что текущая позиция в строке находится строго в начале или конце всей строки (
\Zтакже допускает конечную новую строку), независимо от наличия флагаm. -
Утверждение границы ввода:
^,$ - Утверждает, что текущая позиция является началом или концом ввода, или началом или концом строки, если установлен флаг
m. -
Утверждение предварительного просмотра:
(?=...),(?!...) - Утверждает, что за текущей позицией следует или не следует определенный шаблон.
-
Утверждение обратного просмотра:
(?<=...),(?<!...) - Утверждает, что перед текущей позицией находится или не находится определенный шаблон.
-
Утверждение границы слова:
\b,\B - Утверждает, что текущая позиция является границей слова.
Атомы
Атомы — это наиболее базовые единицы регулярного выражения. Каждый атом потребляет один или несколько символов в строке и либо приводит к сбою сопоставления, либо позволяет шаблону продолжить сопоставление со следующим атомом.
-
Обратная ссылка:
\1,\2 - Сопоставляет ранее сопоставленную подшаблонную группу, захваченную группой захвата.
-
Группа захвата:
(...) - Сопоставляет подшаблон и запоминает информацию о совпадении.
-
Класс символов:
[...],[^...] - Сопоставляет любой символ из набора символов или не из набора символов. Когда включен флаг
v, его также можно использовать для сопоставления строк конечной длины. -
Экранирование класса символов:
\d,\D,\w,\W,\s,\S - Сопоставляет любой символ из предопределенного набора символов или не из предопределенного набора символов.
-
Экранирование символа:
\n,\u{...} - Сопоставляет символ, который может быть неудобно представлен в его литеральной форме.
-
Литеральный символ:
a,b - Сопоставляет конкретный символ.
-
Модификатор:
(?ims-ims:...) - Переопределяет настройки флагов в определенной части регулярного выражения.
-
Именованная обратная ссылка:
\k<name> - Сопоставляет ранее сопоставленную подшаблонную группу, захваченную именованной группой захвата.
-
Именованная группа захвата:
(?<name>...) - Сопоставляет подшаблон и запоминает информацию о совпадении. Группу можно позже идентифицировать по пользовательскому имени вместо ее индекса в шаблоне.
-
Незахватывающая группа:
(?:...) - Сопоставляет подшаблон, не запоминая информацию о совпадении.
-
Экранирование класса символов Unicode:
\p{...},\P{...} - Сопоставляет набор символов, указанный свойством Unicode. Когда включен флаг
v, его также можно использовать для сопоставления строк конечной длины. -
Подстановочный знак:
. - Сопоставляет любой символ, кроме терминаторов строки, если только не установлен флаг
s.
Другие возможности
Эти элементы не определяют сами по себе какой-либо шаблон, но используются для составления шаблонов.
-
Дизъюнкция:
| - Сопоставляет любую из альтернатив, разделенных символом
|. -
Квантификатор:
*,+,?,{n},{n,},{n,m} - Сопоставляет атом определенное количество раз.
Экранированные последовательности
Экранированные последовательности в регулярных выражениях относятся к любому виду синтаксиса, образованному \, за которым следуют один или несколько символов. Они могут выполнять очень разные цели в зависимости от того, что следует за \. Ниже приведен список всех допустимых "экранированных последовательностей":
| Экранированная последовательность | За кем следует | Значение |
|---|---|---|
\A | Нет | Утверждение границы буфера |
\B | Нет | Утверждение не-границы слова |
\D | Нет | Экранирование класса символов, представляющее непробельные символы |
\P |
{, свойство и/или значение Unicode, затем }
| Экранирование класса символов Unicode, представляющее символы без указанного свойства Unicode |
\S | Нет | Экранирование класса символов, представляющее непробельные символы |
\W | Нет | Экранирование класса символов, представляющее не-словарные символы |
\Z | Нет | Утверждение границы буфера |
\b | Нет | Утверждение границы слова; внутри классов символов обозначает U+0008 (BACKSPACE) |
\c | Буква от A до Z или от a до z
| Экранирование символа, представляющее управляющий символ со значением, равным значению буквы по модулю 32 |
\d | Нет |
Экранирование класса символов, представляющее символы цифр (от 0 до 9) |
\f | Нет | Экранирование символа, представляющее U+000C (FORM FEED) |
\k |
<, идентификатор, затем >
| Именованная обратная ссылка |
\n | Нет | Экранирование символа, представляющее U+000A (LINE FEED) |
\p |
{, свойство и/или значение Unicode, затем }
| Экранирование класса символов Unicode, представляющее символы с указанным свойством Unicode |
\q |
{, строка, затем }
| Допустимо только внутри классов символов в режиме v; представляет строку, которая должна быть сопоставлена буквально |
\r | Нет | Экранирование символа, представляющее U+000D (CARRIAGE RETURN) |
\s | Нет | Экранирование класса символов, представляющее пробельные символы |
\t | Нет | Экранирование символа, представляющее U+0009 (CHARACTER TABULATION) |
\u | 4 шестнадцатеричные цифры; или {, от 1 до 6 шестнадцатеричных цифр, затем }
| Экранирование символа, представляющее символ с указанной кодовой точкой |
\v | Нет | Экранирование символа, представляющее U+000B (LINE TABULATION) |
\w | Нет |
Экранирование класса символов, представляющее словарные символы (от A до Z, от a до z, от 0 до 9, _) |
\x | 2 шестнадцатеричные цифры | Экранирование символа, представляющее символ с указанным значением |
\z | Нет | Утверждение границы буфера |
\0 | Нет | Экранирование символа, представляющее U+0000 (NULL) |
\, за которым следует 0 и другая цифра, становится устаревшей восьмеричной экранированной последовательностью, которая запрещена в режиме с учетом Unicode. \, за которым следует любая другая последовательность цифр, становится обратной ссылкой.
Кроме того, \ может сопровождаться некоторыми не буквенно-цифровыми символами, в этом случае экранированная последовательность всегда является экранированием символа, представляющим сам экранированный символ:
-
\$,\(,\),\*,\+,\.,\/,\?,\[,\\,\],\^,\\{,\|,\\}: допустимы везде -
\-: допустимо только внутри классов символов -
\!,\#,\%,\&,\,,\:,\;,\<,\=,\>,\@,\`,\~: допустимо только внутри классов символов в режимеv
Другие ASCII-символы, а именно пробел, ", ', _ и любая буквенная строка, не упомянутая выше, не являются допустимыми экранированными последовательностями. В режиме без учета Unicode экранированные последовательности, которые не являются одной из вышеперечисленных, становятся тождественными экранированиями: они представляют символ, следующий за обратной косой чертой. Например, \a представляет символ a. Такое поведение ограничивает возможность введения новых экранированных последовательностей без проблем с обратной совместимостью, и поэтому запрещено в режиме с учетом Unicode.
Спецификации
Совместимость с браузерами
| Desktop | Mobile | Server | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | Bun | Deno | Node.js | |
backreference |
1 |
12 |
1 |
5 |
1 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
buffer_boundary_assertion |
No |
No |
preview |
No |
preview |
No |
No |
No |
No |
No |
No |
No |
No |
No |
No |
capturing_group |
1 |
12 |
1 |
5 |
1 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
character_class |
1 |
12 |
1 |
5 |
1 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
character_class_escape |
1 |
12 |
1 |
5 |
1 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
character_escape |
1 |
12 |
1 |
5 |
1 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
disjunction |
1 |
12 |
1 |
5 |
1 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
input_boundary_assertion |
1 |
12 |
1 |
5 |
1 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
literal_character |
1 |
12 |
1 |
5 |
1 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
lookahead_assertion |
1 |
12 |
1 |
5 |
1 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
lookbehind_assertion |
62 |
79 |
78 |
49 |
16.4 |
62 |
79 |
46 |
16.4 |
8.0 |
62 |
16.4 |
1.0.0 |
1.0 |
8.10.0 |
modifier |
125 |
125 |
132 |
111 |
26 |
125 |
132 |
83 |
26 |
27.0 |
125 |
26 |
1.2.3 |
1.44 |
23.0.0 |
named_backreference |
64 |
79 |
78 |
51 |
11.1 |
64 |
79 |
47 |
11.3 |
9.0 |
64 |
11.3 |
1.0.0 |
1.0 |
10.0.0 |
named_capturing_group |
64 |
79 |
78 |
51 |
11.1 |
64 |
79 |
47 |
11.3 |
9.0 |
64 |
11.3 |
1.0.0 |
1.0 |
10.0.0 |
non_capturing_group |
1 |
12 |
1 |
5 |
1 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
quantifier |
1 |
12 |
1 |
5 |
1 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
unicode_character_class_escape |
64 |
79 |
78 |
51 |
11.1 |
64 |
79 |
47 |
11.3 |
9.0 |
64 |
11.3 |
1.0.0 |
1.0 |
10.0.0 |
wildcard |
1 |
12 |
1 |
5 |
1 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
word_boundary_assertion |
1 |
12 |
1 |
5 |
1 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
См. также
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Regular_expressions