--- title: RegExp slug: Web/JavaScript/Reference/Global_Objects/RegExp tags: - Constructor - JavaScript - Reference - RegExp - Référence(2) - регулярные выражения translation_of: Web/JavaScript/Reference/Global_Objects/RegExp ---
Конструктор RegExp
создаёт объект регулярного выражения для сопоставления текста с шаблоном.
Введение в то, что представляют собой регулярные выражения, читайте в главе «Регулярные выражения» в руководстве по JavaScript.
Исходный код этого интерактивного примера хранится в репозитории на GitHub. Если вы хотите участвовать в проекте интерактивных примеров, пожалуйста, склонируйте https://github.com/mdn/interactive-examples и пришлите нам запрос на принятие изменений.
Возможны как литеральная запись, так и запись через конструктор:
/pattern/flags
new RegExp(pattern, flags)
pattern
flags
Если определён, может принимать любую комбинацию нижеследующих значений:
g
i
m
y
{{experimental_inline}}lastIndex
этого регулярного выражения (и не пытается сопоставиться с любого более позднего индекса).Существует два способа создания объекта RegExp
: литеральная запись и использование конструктора. При записи строк параметры в литеральной записи не используют символы кавычек, в то время как параметры функции-конструктора используют кавычки. Так что следующие выражения создают одинаковые регулярные выражения:
/ab+c/i; new RegExp('ab+c', 'i');
Литеральная запись обеспечивает компиляцию регулярного выражения при вычислении выражения. Используйте литеральную запись если регулярное выражение будет неизменным. Например, если вы используете литеральную запись для конструирования регулярного выражения, используемого в цикле, регулярное выражение не будет перекомпилироваться на каждой итерации.
Конструктор объекта регулярного выражения, например, new RegExp('ab+c')
, обеспечивает компиляцию регулярного выражения во время выполнения. Используйте функцию-конструктор, если вы знаете, что шаблон регулярного выражения будет меняться или если вы не знаете шаблон и получаете его из внешних источников, например, из пользовательского ввода.
При использовании функции-конструктора необходимо использовать обычные правила экранирования в строках (предварять специальные символы символом обратного слеша «\»). Например, следующие выражения эквивалентны:
var re = /\w+/; var re = new RegExp('\\w+');
Символьные классы | ||
---|---|---|
Символ | Значение | |
. |
(Точка, десятичная запятая) сопоставляется с любым символом за исключением символов новой строки: Обратите внимание, что флаг многострочности Например, шаблон |
|
\d |
Сопоставляется с символом цифры в базовом латинском алфавите. Эквивалентен набору символов Например, шаблоны |
|
\D |
Сопоставляется с любым символом, который не является цифрой в базовом латинском алфавите. Эквивалентен набору символов Например, шаблоны |
|
\w |
Сопоставляется с любым алфавитно-цифровым символом из базового латинского алфавита, включая символ подчёркивания. Эквивалентен набору символов Например, шаблон |
|
\W |
Сопоставляется с любым символом из базового латинского алфавита, не являющимся символом, из которых состоят слова. Эквивалентен набору символов Например, шаблоны |
|
\s |
Сопоставляется с одиночным пробельным символом, который включает в себя пробел, табуляцию, подачу страницы, перевод строки и другие пробельные символы Юникода. Эквивалентен набору символов Например, шаблон |
|
\S |
Сопоставляется с одиночным символом, не являющимся пробельным. Эквивалентен набору символов Например, шаблон |
|
\t |
Сопоставляется с символом табуляции. | |
\r |
Сопоставляется с символом возврата каретки. | |
\n |
Сопоставляется с символом перевода строки. | |
\v |
Сопоставляется с символом вертикальной табуляции. | |
\f |
Сопоставляется с символом подачи страницы. | |
[\b] |
Сопоставляется с символом забоя (не перепутайте его с символьным классом \b ). |
|
\0 |
Сопоставляется с нулевым символом. Не ставьте за ним другую цифру. | |
\cX |
Где Например, шаблон |
|
\xhh |
Сопоставляется с символом с кодом hh (две шестнадцатеричные цифры). |
|
\uhhhh |
Сопоставляется с символом со значением Юникода hhhh (четыре шестнадцатеричные цифры). |
|
\ |
Для символов, которые обычно трактуются буквально, указывает, что следующий символ является специальным и не должен интерпретироваться буквально. Например, шаблон или Для символов, которые обычно трактуются специальным образом, указывает, что следующий символ не является специальным и должен интерпретироваться буквально. Например, звёздочка «*» является специальным символом, обозначающим ноль или более вхождений предшествующего символа при сопоставлении; поэтому шаблон |
|
Наборы символов | ||
Символ | Значение | |
[xyz] |
Набор символов. Сопоставляется с любым из заключённых в квадратные скобки символов. С помощью дефиса вы можете определить диапазон символов. Например, шаблон |
|
[^xyz] |
Отрицательный или дополнительный набор символов. То есть он сопоставляется со всеми символами, что не заключены в квадратные скобки. С помощью дефиса вы можете определить диапазон символов. Например, шаблон |
|
Границы | ||
Символ | Значение | |
^ |
Сопоставляется c началом ввода. Если установлен флаг многострочности, также сопоставляется с позицией сразу за символом переноса строки. Например, шаблон |
|
$ |
Сопоставляется c концом ввода. Если установлен флаг многострочности, также сопоставляется с позицией сразу перед символом переноса строки. Например, шаблон |
|
\b |
Сопоставляется с границей слова нулевой ширины, например с позицией между буквой и пробелом (не путайте его с набором символов Например, шаблон |
|
\B |
Сопоставляется с границей не-слов нулевой ширины, например с позицией между двумя буквами или двумя пробелами. Например, шаблон |
|
Группировка и обратные ссылки | ||
Символ | Значение | |
(x) |
Сопоставляется с Например, шаблон Захват групп ведёт к проседанию производительности. Если вам не нужно повторно ссылаться на захваченную подстроку, лучше использовать скобки без захвата (смотрите ниже). |
|
\n |
Где Например, шаблон |
|
(?:x) |
Сопоставляется с x , но не запоминает сопоставление. Называется «незахватывающие скобки». Сопоставленную подстроку нельзя достать из элементов [1], ..., [n] результирующего массива или из предопределённых свойств $1, ..., $9 объекта RegExp . |
|
Квантификаторы | ||
Символ | Значение | |
x* |
Сопоставляется с предшествующим элементом x ноль или более раз. Например, шаблон |
|
x+ |
Сопоставляется с предшествующим элементом x один или более раз. Эквивалентен квантификатору Например, шаблон |
|
x*? x+? |
Сопоставляется с предшествующим элементом x подобно квантификаторам Например, шаблон |
|
x? |
Сопоставляется с предшествующим элементом x ноль или один раз. Например, шаблон Если символ используется сразу после какого-то из квантификаторов Также символ используется в квантификаторах предпросмотра |
|
x(?=y) |
Сопоставлется с x , только если за x следует y . Например, шаблон /Джек(?=Шпрот)/ сопоставлется со строкой «Джек» только если за ней следует строка «Шпрот». Шаблон /Джек(?=Шпрот|Мороз)/ сопоставлется со строкой «Джек» только если за ней следуют строки «Шпрот» или «Мороз». Однако, ни «Шпрот», ни «Мороз» не являются частью результата сопоставления. |
|
x(?!y) |
Сопоставлется с Выражение |
|
(?<=y)x |
Например, / |
|
(?<!y)x |
|
|
x|y |
Сопоставляется либо с Например, шаблон |
|
x{n} |
Где Например, шаблон |
|
x{n,} |
Где Например, шаблон |
|
x{n,m} |
Где Например, шаблон |
RegExp.length
RegExp.length
равно 2.Глобальный объект RegExp
не имеет собственных методов, однако, он наследует некоторые методы через цепочку прототипов.
Следующий скрипт использует метод {{jsxref("String.prototype.replace()", "replace()")}} экземпляра строки {{jsxref("Global_Objects/String", "String")}} для сопоставления с именем в формате имя фамилия и выводит его в формате фамилия, имя. В тесте замены скрипт использует заменители $1
и $2
, которые заменяются на результаты соответствующих сопоставившихся подгрупп регулярного выражения.
var re = /(\w+)\s(\w+)/; var str = 'John Smith'; var newstr = str.replace(re, '$2, $1'); console.log(newstr); // пример с русскими буквами var re = /([а-яё]+)\s([а-яё]+)/i; var str = 'Джон Смит'; var newstr = str.replace(re, '$2, $1'); console.log(newstr);
Пример выведет «Smith, John» и «Смит, Джон»
Символы конца строки различаются на различных платформах (Unix, Windows и так далее). Разбиение строк из этого примера работает на всех платформах.
var text = 'Некоторый текст\nЕщё текст\r\nИ ещё\rЭто конец'; var lines = text.split(/\r\n|\r|\n/); console.log(lines); // выведет [ 'Некоторый текст', 'Ещё текст', 'И ещё', 'Это конец' ]
Обратите внимание, что порядок шаблонов в регулярном выражении имеет значение.
var s = 'Please yes\nmake my day!'; s.match(/yes.*day/); // Вернёт null s.match(/yes[^]*day/); // Вернёт 'yes\nmake my day'
Этот пример демонстрирует, как можно использовать флаг «липучести» регулярных выражений для сопоставления с отдельными строками многострочного ввода.
var text = 'Первая строка\nВторая строка'; var regex = /(\S+) строка\n?/y; var match = regex.exec(text); console.log(match[1]); // напечатает 'Первая' console.log(regex.lastIndex); // напечатает '14' var match2 = regex.exec(text); console.log(match2[1]); // напечатает 'Вторая' console.log(regex.lastIndex); // напечатает '27' var match3 = regex.exec(text); console.log(match3 === null); // напечатает 'true'
Во время выполнения можно проверить, поддерживается ли флаг «липучести», при помощи блока try { … } catch { … }
. Для этого надо использовать либо выражение с eval(…)
, либо конструктор RegExp(строка-регулярки, строка-с-флагами)
(поскольку нотация /регулярка/флаги
обрабатывается во время компиляции, исключение будет выброшено до того, как выполнение достигнет блока catch
). Например:
var supports_sticky; try { RegExp('', 'y'); supports_sticky = true; } catch(e) { supports_sticky = false; } console.log(supports_sticky); // напечатает 'true'
Как уже сказано выше, символьные классы \w
и \W
сопоставляются только с базовыми символами ASCII; то есть, с символами от «a» до «z», от «A» до «Z», от «0» до «9» и символом «_». Для сопоставления с символами из других языков, например, с кириллическими или иврита, используйте форму \uhhhh
, где «hhhh» — это значение символа Юникода, записанное в шестнадцатеричной форме. Этот пример демонстрирует, как можно выделить символы Юникода, составляющие слова.
var text = 'Образец text на русском языке'; var regex = /[\u0400-\u04FF]+/g; var match = regex.exec(text); console.log(match[0]); // напечатает 'Образец' console.log(regex.lastIndex); // напечатает '7' var match2 = regex.exec(text); console.log(match2[0]); // напечатает 'на' [не 'text'] console.log(regex.lastIndex); // напечатает '15' // и так далее
Вот на этом внешнем ресурсе можно составить полный диапазон блоков Юникода для различных письменностей: regexp-unicode-block.
var url = 'http://xxx.domain.com'; console.log(/[^.]+/.exec(url)[0].substr(7)); // напечатает 'xxx'
Спецификация | Статус | Комментарии |
---|---|---|
ECMAScript 1-е издание. | Стандарт | Изначальное определение. Реализована в JavaScript 1.1. |
{{SpecName('ES5.1', '#sec-15.10', 'RegExp')}} | {{Spec2('ES5.1')}} | |
{{SpecName('ES6', '#sec-regexp-regular-expression-objects', 'RegExp')}} | {{Spec2('ES6')}} |
Возможность | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Базовая поддержка | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} |
Флаг «липучести» («y») | {{CompatChrome("39")}} (через флаг) | {{CompatGeckoDesktop("1.9")}} ES4-Style {{bug(773687)}} | {{CompatNo}} | {{CompatNo}} | {{CompatNo}} |
Возможность | Android | Chrome для Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Базовая поддержка | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} |
Флаг «липучести» («y») | {{CompatNo}} | {{CompatNo}} | {{CompatGeckoMobile("1.9")}} ES4-Style {{bug(773687)}} | {{CompatNo}} | {{CompatNo}} | {{CompatNo}} |
Начиная с Gecko 34 {{geckoRelease(34)}}, в случае захвата группы с квантификаторами, предотвращающими появление группы в результате сопоставления, сопоставившийся текст для захваченной группы теперь имеет значение undefined
вместо пустой строки:
// Firefox 33 или более ранние 'x'.replace(/x(.)?/g, function(m, group) { console.log("'group:" + group + "'"); }); // 'group:' // Firefox 34 или более новые 'x'.replace(/x(.)?/g, function(m, group) { console.log("'group:" + group + "'"); }); // 'group:undefined'
Обратите внимание, что для поддержания обратной совместимости, свойства RegExp.$N
по-прежнему возвращают пустую строку вместо значения undefined
(bug 1053944).