RegExp
Baseline Widely available *
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
* Some parts of this feature may have varying levels of support.
Сводка
Конструктор RegExp
создаёт объект регулярного выражения для сопоставления текста с шаблоном.
Введение в то, что представляют собой регулярные выражения, читайте в главе «Регулярные выражения» в руководстве по JavaScript.
Интерактивный пример
Синтаксис
Возможны как литеральная запись, так и запись через конструктор:
/pattern/flags new RegExp(pattern, flags)
Параметры
pattern
-
Текст регулярного выражения.
flags
-
Если определён, может принимать любую комбинацию нижеследующих значений:
g
-
глобальное сопоставление
i
-
игнорирование регистра при сопоставлении
m
-
сопоставление по нескольким строкам; символы начала и конца (^ и $) начинают работать по нескольким строкам (то есть, происходит сопоставление с началом или концом каждой строки (строки разделяются символами \n или \r), а не только с началом или концом всей вводимой строки)
y
Экспериментальная возможность-
«липкий» поиск; сопоставление в целевой строке начинается с индекса, на который указывает свойство
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.prototype
-
Позволяет добавлять свойства ко всем объектам регулярных выражений.
RegExp.length
-
Значение
RegExp.length
равно 2.
Методы
Глобальный объект RegExp
не имеет собственных методов, однако, он наследует некоторые методы через цепочку прототипов.
Примеры
Пример: использование регулярных выражений для смены формата данных
Следующий скрипт использует метод replace()
экземпляра строки 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.
Пример: извлечение имени поддомена из URL
var url = "http://xxx.domain.com";
console.log(/[^.]+/.exec(url)[0].substr(7)); // напечатает 'xxx'
Спецификации
Specification |
---|
ECMAScript Language Specification # sec-regexp-regular-expression-objects |
Совместимость с браузерами
BCD tables only load in the browser
Примечания по Gecko
Начиная с Gecko 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).