Регулярные выражения
Базовая Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с июля 2015 года.
Объект RegExp используется для сопоставления текста с шаблоном.
Для введения в регулярные выражения прочитайте главу Регулярные выражения в руководстве по JavaScript. Подробную информацию о синтаксисе регулярных выражений см. в справочнике по регулярным выражениям.
Описание
Буквальная нотация и конструктор
Существует два способа создания объекта RegExp: буквальная нотация и конструктор.
- Буквальная нотация принимает шаблон между двумя косыми чертами, за которыми следуют необязательные флаги после второй косой черты.
- Функция-конструктор принимает в качестве первого параметра строку или объект
RegExp, а в качестве второго параметра — строку необязательных флагов.
Следующие три выражения создают один и тот же объект регулярного выражения:
const re = /ab+c/i; // literal notation
// OR
const re = new RegExp("ab+c", "i"); // constructor with string pattern as first argument
// OR
const re = new RegExp(/ab+c/, "i"); // constructor with regular expression literal as first argument
Перед использованием регулярных выражений их необходимо скомпилировать. Этот процесс позволяет им более эффективно выполнять сопоставления. Подробнее об этом процессе можно узнать в документации dotnet.
Буквальная нотация приводит к компиляции регулярного выражения при вычислении выражения. С другой стороны, конструктор объекта RegExp, new RegExp('ab+c'), приводит к компиляции регулярного выражения во время выполнения.
Используйте строку в качестве первого аргумента конструктора RegExp(), когда вы хотите создать регулярное выражение из динамических входных данных.
Флаги в конструкторе
Выражение new RegExp(/ab+c/, flags) создаст новый RegExp, используя исходный код первого параметра и флаги, предоставленные вторым.
При использовании функции-конструктора необходимы обычные правила экранирования строк (предшествование специальным символам с помощью \ при включении в строку).
Например, следующее эквивалентно:
const re = /\w+/;
// OR
const re = new RegExp("\\w+");
Специальная обработка для регулярных выражений
Примечание: Является ли что-то "регулярным выражением", можно определить методом утиной типизации. Это не обязательно должен быть RegExp!
Некоторые встроенные методы обрабатывают регулярные выражения особым образом. Они определяют, является ли x регулярным выражением, выполняя несколько шагов:
-
xдолжен быть объектом (не примитивом). - Если
x[Symbol.match]неundefined, проверьте, является ли он истинным. - В противном случае, если
x[Symbol.match]являетсяundefined, проверьте, был лиxсоздан с помощью конструктораRegExp. (Этот шаг должен происходить редко, поскольку еслиxявляется объектомRegExp, который не был изменен, он должен иметь свойствоSymbol.match.)
Обратите внимание, что в большинстве случаев проверка будет проходить через Symbol.match, что означает:
- Реальный объект
RegExp, у которого значение свойстваSymbol.matchявляется ложным, но неundefined(даже при сохранении всего остального, такого какexecи[Symbol.replace]()), может использоваться так, как будто это не регулярное выражение. - Не
RegExpобъект со свойствомSymbol.matchбудет трактоваться как регулярное выражение.
Этот выбор был сделан потому, что [Symbol.match]() является наиболее показательным свойством, указывающим на намерение использовать что-либо для сопоставления. (exec также мог бы использоваться, но поскольку это не символьное свойство, было бы слишком много ложных срабатываний.) Места, которые особо обрабатывают регулярные выражения, включают:
-
String.prototype.endsWith(),startsWith()иincludes()выдаютTypeError, если первый аргумент является регулярным выражением. -
String.prototype.matchAll()иreplaceAll()проверяют, установлен ли флаг глобальный, если первый аргумент является регулярным выражением, перед вызовом его метода[Symbol.matchAll]()или[Symbol.replace](). - Конструктор
RegExp()напрямую возвращает аргументpatternтолько в том случае, еслиpatternявляется регулярным выражением (среди нескольких других условий). Еслиpatternявляется регулярным выражением, он также будет анализировать свойстваpatternsourceиflagsвместо приведенияpatternк строке.
Например, String.prototype.endsWith() преобразует все входные данные в строки, но выдаст ошибку, если аргумент является регулярным выражением, поскольку он предназначен только для сопоставления строк, а использование регулярного выражения, вероятно, является ошибкой разработчика.
"foobar".endsWith({ toString: () => "bar" }); // true
"foobar".endsWith(/bar/); // TypeError: First argument to String.prototype.endsWith must not be a regular expression
Вы можете обойти проверку, установив [Symbol.match] в ложное значение, которое не является undefined. Это будет означать, что регулярное выражение не может быть использовано для String.prototype.match() (поскольку без [Symbol.match] match() создаст новый объект RegExp с двумя окружающими косыми чертами, добавленными re.toString()), но оно может быть использовано практически для всего остального.
const re = /bar/g;
re[Symbol.match] = false;
"/bar/g".endsWith(re); // true
re.exec("bar"); // [ 'bar', index: 0, input: 'bar', groups: undefined ]
"bar & bar".replace(re, "foo"); // 'foo & foo'
Свойства RegExp в стиле Perl
Обратите внимание, что несколько свойств RegExp имеют как длинные, так и короткие (в стиле Perl) имена. Оба имени всегда ссылаются на одно и то же значение. (Perl — это язык программирования, по образцу которого JavaScript создал свои регулярные выражения.) См. также устаревшие свойства RegExp.
Конструктор
-
RegExp() - Создает новый объект
RegExp.
Статические свойства
-
RegExp.$1, …,RegExp.$9Устарело - Статические свойства только для чтения, содержащие заключенные в скобки сопоставления подстрок.
-
RegExp.input($_) Устарело - Статическое свойство, содержащее последнюю строку, с которой успешно сопоставилось регулярное выражение.
-
RegExp.lastMatch($&) Устарело - Статическое свойство только для чтения, содержащее последнюю сопоставленную подстроку.
-
RegExp.lastParen($+) Устарело - Статическое свойство только для чтения, содержащее последнее сопоставленное подстрока в скобках.
-
RegExp.leftContext($`) Устарело - Статическое свойство только для чтения, содержащее подстроку, предшествующую последнему сопоставлению.
-
RegExp.rightContext($') Устарело - Статическое свойство только для чтения, содержащее подстроку, следующую за последним сопоставлением.
-
RegExp[Symbol.species] - Конструктор, используемый для создания производных объектов.
Статические методы
-
RegExp.escape() - Экранирует любые потенциальные синтаксические символы регулярных выражений в строке и возвращает новую строку, которую можно безопасно использовать в качестве буквального шаблона для конструктора
RegExp().
Свойства экземпляра
Эти свойства определены на RegExp.prototype и разделяются всеми экземплярами RegExp.
-
RegExp.prototype.constructor - Функция-конструктор, создавшая объект экземпляра. Для экземпляров
RegExpначальное значение — конструкторRegExp. -
RegExp.prototype.dotAll - Сопоставляет ли
.символы новой строки или нет. -
RegExp.prototype.flags - Строка, содержащая флаги объекта
RegExp. -
RegExp.prototype.global - Тестировать ли регулярное выражение против всех возможных совпадений в строке или только против первого.
-
RegExp.prototype.hasIndices - Предоставляет ли результат регулярного выражения начальные и конечные индексы захваченных подстрок.
-
RegExp.prototype.ignoreCase - Игнорировать ли регистр при попытке сопоставления в строке.
-
RegExp.prototype.multiline - Искать ли в строках на нескольких строках.
-
RegExp.prototype.source - Текст шаблона.
-
RegExp.prototype.sticky - Является ли поиск липким.
-
RegExp.prototype.unicode - Включены ли функции Unicode.
-
RegExp.prototype.unicodeSets - Включен ли флаг
v, являющийся обновлением режимаu.
Эти свойства являются собственными свойствами каждого экземпляра RegExp.
-
lastIndex - Индекс, с которого начнется следующее сопоставление.
Методы экземпляра
-
RegExp.prototype.compile()Устарело - (Пере-)компилирует регулярное выражение во время выполнения скрипта.
-
RegExp.prototype.exec() - Выполняет поиск совпадения в строковом параметре.
-
RegExp.prototype.test() - Тестирует наличие совпадения в строковом параметре.
-
RegExp.prototype.toString() - Возвращает строковое представление указанного объекта. Переопределяет метод
Object.prototype.toString(). -
RegExp.prototype[Symbol.match]() - Выполняет сопоставление с заданной строкой и возвращает результат сопоставления.
-
RegExp.prototype[Symbol.matchAll]() - Возвращает все совпадения регулярного выражения со строкой.
-
RegExp.prototype[Symbol.replace]() - Заменяет совпадения в заданной строке новой подстрокой.
-
RegExp.prototype[Symbol.search]() - Ищет совпадение в заданной строке и возвращает индекс найденного шаблона в строке.
-
RegExp.prototype[Symbol.split]() - Разделяет заданную строку на массив, разбивая строку на подстроки.
Примеры
Использование регулярного выражения для изменения формата данных
Следующий скрипт использует метод String.prototype.replace() для сопоставления имени в формате "имя фамилия" и вывода его в формате "фамилия, имя".
В тексте замены скрипт использует $1 и $2 для указания результатов соответствующих скобок в шаблоне регулярного выражения.
const re = /(\w+)\s(\w+)/; const str = "Maria Cruz"; const newStr = str.replace(re, "$2, $1"); console.log(newStr);
Это выводит "Cruz, Maria".
Использование регулярного выражения для разделения строк с различными окончаниями строк/концами строк/переводами строк
Стандартное окончание строки зависит от платформы (Unix, Windows и т. д.). Разделение строк, представленное в этом примере, работает на всех платформах.
const text = "Some text\nAnd some more\r\nAnd yet\nThis is the end"; const lines = text.split(/\r?\n/); console.log(lines); // [ 'Some text', 'And some more', 'And yet', 'This is the end' ]
Обратите внимание, что порядок шаблонов в регулярном выражении имеет значение.
Использование регулярного выражения на нескольких строках
По умолчанию символ . не сопоставляется с символами новой строки. Чтобы он сопоставлялся с символами новой строки, используйте флаг s (режим dotAll).
const s = "Please yes\nmake my day!"; s.match(/yes.*day/); // Returns null s.match(/yes.*day/s); // Returns ["yes\nmake my day"]
Использование регулярного выражения с флагом "sticky"
Флаг sticky указывает, что регулярное выражение выполняет "липкое" сопоставление в целевой строке, пытаясь сопоставить, начиная с RegExp.prototype.lastIndex.
const str = "#foo#"; const regex = /foo/y; regex.lastIndex = 1; regex.test(str); // true regex.lastIndex = 5; regex.test(str); // false (lastIndex is taken into account with sticky flag) regex.lastIndex; // 0 (reset after match failure)
Разница между флагом "sticky" и флагом "global"
С флагом "sticky" y следующее совпадение должно произойти в позиции lastIndex, в то время как с флагом "global" g совпадение может произойти в позиции lastIndex или позже:
const re = /\d/y;
let r;
while ((r = re.exec("123 456"))) {
console.log(r, "AND re.lastIndex", re.lastIndex);
}
// [ '1', index: 0, input: '123 456', groups: undefined ] AND re.lastIndex 1
// [ '2', index: 1, input: '123 456', groups: undefined ] AND re.lastIndex 2
// [ '3', index: 2, input: '123 456', groups: undefined ] AND re.lastIndex 3
// … and no more match.
С флагом "global" g будут сопоставлены все 6 цифр, а не только 3.
Регулярные выражения и символы Unicode
\w и \W сопоставляют только символы на основе ASCII; например, a до z, A до Z, 0 до 9 и _.
Чтобы сопоставлять символы из других языков, таких как кириллица или иврит, используйте \uHHHH, где HHHH — это шестнадцатеричное значение Unicode символа.
Этот пример демонстрирует, как можно выделить символы Unicode из слова.
const text = "Образец text на русском языке"; const regex = /[\u0400-\u04ff]+/g; const match = regex.exec(text); console.log(match[0]); // 'Образец' console.log(regex.lastIndex); // 7 const match2 = regex.exec(text); console.log(match2[0]); // 'на' (did not log 'text') console.log(regex.lastIndex); // 15 // and so on
Функция экранирования свойств Unicode предоставляет более простой способ нацеливания на определенные диапазоны Unicode, позволяя использовать такие выражения, как \p{scx=Cyrl} (для сопоставления любой кириллической буквы) или \p{L}/u (для сопоставления буквы из любого языка).
Извлечение имени поддомена из URL
const url = "http://xxx.example.com"; console.log(/^https?:\/\/(.+?)\./.exec(url)[1]); // 'xxx'
Примечание: Вместо использования регулярных выражений для разбора URL обычно лучше использовать встроенный в браузер парсер URL, используя API URL.
Создание регулярного выражения из динамических входных данных
const breakfasts = ["bacon", "eggs", "oatmeal", "toast", "cereal"];
const order = "Let me get some bacon and eggs, please";
order.match(new RegExp(`\\b(${breakfasts.join("|")})\\b`, "g"));
// Returns ['bacon', 'eggs']
Спецификации
Совместимость с браузерами
| Настольные компьютеры | Мобильные | Сервер | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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 | |
RegExp |
1 |
12 |
1 |
5 |
1 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@match |
50 |
13 |
49 |
37 |
10 |
50 |
49 |
37 |
10 |
5.0 |
50 |
10 |
1.0.0 |
1.0 |
6.0.0 |
@@matchAll |
73 |
79 |
67 |
60 |
13 |
73 |
67 |
52 |
13 |
5.0 |
73 |
13 |
1.0.0 |
1.0 |
12.0.0 |
@@replace |
50 |
79 |
49 |
37 |
10 |
50 |
49 |
37 |
10 |
5.0 |
50 |
10 |
1.0.0 |
1.0 |
6.0.0 |
@@search |
50 |
13 |
49 |
37 |
10 |
50 |
49 |
37 |
10 |
5.0 |
50 |
10 |
1.0.0 |
1.0 |
6.0.0 |
@@species |
51 |
13 |
49 |
38 |
10 |
51 |
49 |
41 |
10 |
5.0 |
51 |
10 |
1.0.0 |
1.0 |
6.5.0 |
@@split |
50 |
79 |
49 |
37 |
10 |
50 |
49 |
37 |
10 |
5.0 |
50 |
10 |
1.0.0 |
1.0 |
6.0.0 |
RegExp |
1 |
12 |
1 |
5 |
1 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
compile |
1 |
12 |
1 |
6 |
3.1 |
18 |
4 |
10.1 |
2 |
1.0 |
4.4 |
2 |
1.0.0 |
1.0 |
0.10.0 |
dotAll |
62 |
79 |
78 |
49 |
11.1 |
62 |
79 |
46 |
11.3 |
8.0 |
62 |
11.3 |
1.0.0 |
1.0 |
8.10.0 |
escape |
136 |
136 |
134 |
121 |
18.2 |
136 |
134 |
90 |
18.2 |
29.0 |
136 |
18.2 |
1.1.22 |
2.3.2 |
24.0.0 |
exec |
1 |
12 |
1 |
5 |
1 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
flags |
49 |
79 |
37 |
39 |
9 |
49 |
37 |
41 |
9 |
5.0 |
49 |
9 |
1.0.0 |
1.0 |
6.0.0 |
global |
1 |
12 |
1 |
5 |
1 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
hasIndices |
90 |
90 |
88 |
76 |
15 |
90 |
88 |
64 |
15 |
15.0 |
90 |
15 |
1.0.0 |
1.8 |
16.0.0 |
ignoreCase |
1 |
12 |
1 |
5 |
1 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
input |
1 |
12 |
1 |
15 |
3 |
18 |
4 |
14 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
lastIndex |
1 |
12 |
1 |
5 |
1 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
lastMatch |
1 |
12 |
1 |
10.5 |
3 |
18 |
4 |
11 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
lastParen |
1 |
12 |
1 |
10.5 |
3 |
18 |
4 |
11 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
leftContext |
1 |
12 |
1 |
8 |
3 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
multiline |
1 |
12 |
1 |
5 |
1 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
n |
1 |
12 |
1 |
5 |
1 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
rightContext |
1 |
12 |
1 |
8 |
3 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
source |
1 |
12 |
1 |
5 |
1 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
sticky |
49 |
13 |
3 |
36 |
10 |
49 |
4 |
36 |
10 |
5.0 |
49 |
10 |
1.0.0 |
1.0 |
6.0.0 |
test |
1 |
12 |
1 |
5 |
1 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
toString |
1 |
12 |
1 |
5 |
1 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
unicode |
50 |
12Case folding is implemented in version 13 |
46 |
37 |
10 |
50 |
46 |
37 |
10 |
5.0 |
50 |
10 |
1.0.0 |
1.0 |
6.0.0Case folding is implemented in version 8.6.0 |
unicodeSets |
112 |
112 |
116 |
98 |
17 |
112 |
116 |
75 |
17 |
23.0 |
112 |
17 |
1.0.0 |
1.32 |
20.0.0 |
Примечания, специфичные для Firefox
Начиная с Firefox 34, в случае захватывающей группы с квантификаторами, препятствующими ее выполнению, сопоставленный текст для захватывающей группы теперь undefined вместо пустой строки:
// Firefox 33 or older
"x".replace(/x(.)?/g, (m, group) => {
console.log(`group: ${JSON.stringify(group)}`);
});
// group: ""
// Firefox 34 or newer
"x".replace(/x(.)?/g, (m, group) => {
console.log(`group: ${group}`);
});
// group: undefined
Обратите внимание, что из-за совместимости с веб-браузерами RegExp.$N по-прежнему будет возвращать пустую строку вместо undefined (bug 1053944).
См. также
- Polyfill многих современных
RegExpфункций (dotAll,stickyфлаги, именованные группы захвата и т. д.) вcore-js - Руководство по регулярным выражениям
- Регулярные выражения
String.prototype.match()String.prototype.replace()String.prototype.split()
© 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/Global_Objects/RegExp