Объект RegExp в JavaScript

Создание регулярного выражения

Объект-конструктор RegExp используется для создания объекта регулярного выражения. Регулярное выражение - это шаблон, которому должна удовлетворять строка или её часть. Такие шаблоны используются, например, для проверки введённых в форму данных (действительно ли введён e-mail и т.п.).

Объект регулярного выражения создаётся из переданных строковых аргументов.

new RegExp(шаблон, флаги)

Также для создания регулярного выражения может использоваться короткая запись:

/шаблон/флаги
шаблон
Основная часть регулярного выражения. Шаблон текста, написанный по определённым правилам.
флаги
Специальные символы, определяющие свойства регулярного выражения.

Нижеприведенные записи идентичны:

var reg = new RegExp('абв', 'i');
/* или */
var reg = /абв/i;

Такая запись не только уменьшает код, но и улучшает его производительность. JavaScript обработает такое регулярное выражение всего один раз перед выполнением скрипта, а созданное с помощью конструктора выражение обрабатывается во время выполнения скрипта. Это особенно имеет значение, если регулярное выражение создаётся внутри больших циклов. Однако, если само выражение еще не известно на стадии написания скрипта или может меняться (то есть используются переменные), тогда необходимо использовать конструктор.

Шаблон регулярного выражения представляет собой набор простых и специальных символов. Например, выражение /thin/ соответствует любой строке, в которой имеется последовательность символов thin (something и т.п.). Это пример простого шаблона. Обычно в практике требуются более сложные шаблоны: соответствие именно началу или концу строки, использование определенного регистра букв, наличие или отсутсвие определённых символов в строке. Для написания таких шаблонов используются специальные символы и флаги.

Флаги

Ниже в таблице представлено описание всех флагов для регулярных выражений.

Флаг Описание
g Флаг глобального сопоставления. Используется, чтобы найти все сопоставления строки с указанным шаблоном. Без указания данного флага поиск останавливается после первого найденного сопоставления.
i Флаг игнорирования регистра. Регистр букв не учитывается при сопоставлении.
m Флаг многострочности. Если в строке имеются символы переноса строки (\n, \r), то каждая строка рассматривается как самостоятельная.

Специальные символы

В следующих таблицах представлено описание всех специальных символов для регулярных выражений. Они разделены по назначению.

Классы символов

Символ Описание
. Соответствует одному любому символу, кроме символа конца строки (\n, \r, \u2028 или \u2029). Флаг многострочности не изменяет поведение данного символа.

/th../ сопоставляется с подстрокой thin в строке something.
\d Соответствует любой арабской цифре от 0 до 9.

/\d/ сопоставляется с подстрокой 1 в строке a1-b2.
\D Соответствует любому символу, кроме арабской цифры от 0 до 9.

/\D/ сопоставляется с подстрокой a в строке a1-b2.
\w Соответствует любой арабской цифре от 0 до 9, букве латинского алфавита в любом регистре или символу подчёркивания.

/\w/ сопоставляется с подстрокой a в строке (a1-b2).
\W Соответствует любому символу, кроме арабской цифры от 0 до 9, буквы латинского алфавита в любом регистре или символа подчёркивания.

/\W/ сопоставляется с подстрокой ( в строке (a1-b2).
\s Соответствует одному пробельному символу (пробел, табуляция, перевод строки и другие пробельные символы стандарта Unicode).

/\s/ сопоставляется с подстрокой \n в строке a1\nb2.
\S Соответствует любому символу, кроме пробельного (пробел, табуляция, перевод строки и другие пробельные символы стандарта Unicode).

/\S/ сопоставляется с подстрокой a в строке    a1-b2.
\t Соответствует одному символу табуляции.
\n Соответствует одному символу перевода строки.
\uHHHH Соответствует одному символу с кодом HHHH в стандарте Unicode (HHHH - шестнадцатеричный код).
\ Изменяет трактование следующего за ним символа в регулярном выражении. Если символ является специальным, то его действие отменяется и он трактуется буквально.
/\./ сопоставляется с подстрокой . в строке a1.b2.

Если символ изначально трактуется буквально, то он превращается в специальный символ.
/\d/ сопоставляется с подстрокой 4 в строке d4.

Наборы символов

Символ Описание
[abc] Соответствует одному любому символу из указанного в скобках набора. Символы в наборе должны перечисляться подряд, без разделительных знаков. Можно указывать диапазон символов через дефис. Выражение /[abcdABCD12345]/ полностью идентично выражению /[a-dA-D1-5]/.

/[0-9]/ сопоставляется с подстрокой 1 в строке a1-b2.
[^abc] Соответствует одному любому символу, кроме тех, что указаны в наборе. Символы в наборе должны перечисляться подряд, без разделительных знаков. Можно указывать диапазон символов через дефис. Выражение /[^abcdABCD12345]/ полностью идентично выражению /[^a-dA-D1-5]/. Выражение с пустым набором /[^]/ сопоставляется любому символу, включая символы переноса строки (в отличие от символа /./).

/[^a-z]/ сопоставляется с подстрокой 1 в строке a1-b2.

Границы

Символ Описание
^ Соответствует началу строки. Сопоставление будет найдено только в начале строки. Если указать флаг многострочности, то сопоставление также будет искаться после каждого символа переноса строки.

/^a1/ сопоставляется с подстрокой a1 в строке a1-b2.
/^b2/ не сопоставляется с подстрокой b2 в строке a1-b2.
$ Соответствует концу строки. Сопоставление будет найдено только в конце строки. Если указать флаг многострочности, то сопоставление также будет искаться перед каждым символом переноса строки.

/a1$/ не сопоставляется с подстрокой a1 в строке a1-b2.
/b2$/ сопоставляется с подстрокой b2 в строке a1-b2.
\b Соответствует границе слова. Можно обозначить как начало, так и конец слова.

/ing\b/ сопоставляется с подстрокой ing в строке something thin.
/\bing/ не сопоставляется с подстрокой ing в строке something thin.
\B Соответствует не-границе слова. То есть данный символ означает, что в данном месте слово не заканчивается (не начинается).

/ing\B/ не сопоставляется с подстрокой ing в строке something thin.
/\Bing/ сопоставляется с подстрокой ing в строке something thin.

Группировка символов

Символ Описание
(a) a - любая часть регулярного выражения. Если найдено сопоставление, то JavaScript запоминает часть строки, которая соответствует выражению в скобках, для дальнейшего использования. Называется захватывающие скобки. Их использование влияет на производительность. Если подстроки в дальнейшем не используются, то лучше применять незахватывающие скобки.

/(b)2/ сопоставляется с подстрокой b2 в строке a1-b2 и запоминается b.
\n n - любое натуральное число. Соответствует той части строки, которая сопоставлена n-ой по счёту группе в круглых скобках. Нумерация начинается с 1.

/(.)bb\1/ сопоставляется с подстрокой abba в строке abbacc. В круглые скобки помещается символ a, запоминается и подставляется в регулярное выражение вместо \1.
(?:a) a - любая часть регулярного выражения. JavaScript не запоминает часть строки, которая соответствует выражению в скобках. Называется незахватывающие скобки. Не ухудшают производительность.

/(?:b)2/ сопоставляется с подстрокой b2 в строке a1-b2 и ничего не запоминается.

Квантификаторы

Символ Описание
a* Соответствует вхождению a в строке 0 или более раз. То есть данный символ означает, что в данном месте указанная подстрока может встречаться несколько раз или вовсе отсутствовать. Сопоставление выбирается с наибольшей подстрокой.

/so*/ сопоставляется с подстрокой sooo в строке sooomething и с подстрокой s в строке same.
a+ Соответствует вхождению a в строке 1 или более раз. То есть данный символ означает, что в данном месте указанная подстрока должна встречаться хотя бы один раз. Сопоставление выбирается с наибольшей подстрокой.

/so+/ сопоставляется с подстрокой sooo в строке sooomething и с подстрокой so в строке some.
a? Соответствует вхождению a в строке 0 или 1 раз. То есть данный символ означает, что в данном месте указанная подстрока либо есть, либо нет. Если вхождение есть, то оно включается в результат.

Выражению /(some)?thing/ удовлетворяют подстроки thing и something в строке something thin, но сопоставление будет с наибольшей подстрокой, то есть something.
a{n} n - любое натуральное число. Соответствует ровно n вхождениям a.

/so{2}/ сопоставляется с подстрокой soo в строке sooooomething. В строке something сопоставление не будет найдено.
a{n,} n - любое натуральное число. Соответствует как минимум n вхождениям a. Сопоставление выбирается с наибольшей подстрокой.

/so{2,}/ сопоставляется с подстрокой sooooo в строке sooooomething. В строке something сопоставление не будет найдено.
a{n,m} n, m - любые натуральные числа. Соответствует как минимум n и как максимум m вхождениям a. Сопоставление выбирается с наибольшей подстрокой.

/so{2,3}/ сопоставляется с подстрокой sooo в строке sooooomething. В строке something сопоставление не будет найдено.
a*?
a+?
a??
a{n}?
a{n,}?
a{n,m}?
Квантификаторы *, +, ? и {} называются жадными, так как сопоставление выбирается с наибольшей подстрокой. Добавление ? делает их нежадными, то есть сопоставление выбирается с наименьшей подстрокой.

/".*?"/ сопоставляется с подстрокой "some" в строке "some" "thing".
/so+?/ сопоставляется с подстрокой so в строке sooomething.
/(some)??thing/ сопоставляется с подстрокой thing в строке something thin.
a(?=b) Соответствует a только в том случае, если далее следует b. При этом b не включается в результат.

/.*(?=thing)/ сопоставляется с подстрокой some в строке something.
a(?!b) Соответствует a только в том случае, если далее не следует b.

/some(?!th)/ сопоставляется с подстрокой some в строке somebody, но не в строке something.
a|b Соответствует либо a, либо b.

/thing|body/ сопоставляется с подстрокой thing в строке something либо с подстрокой body в строке somebody.

Свойства объекта RegExp

length

Свойство length всегда имеет значение 2.

alert(RegExp.length); // 2

prototype

Свойство prototype наследуется из класса Object.

var reg = new RegExp();
RegExp.prototype.prop = 'новое свойство';
alert(reg.prop); /* 'новое свойство' */

Методы объекта RegExp

Объект RegExp не имеет своих собственных методов.

Свойства наследников RegExp

constructor

Свойство constructor наследуется из класса Object.

var reg = new RegExp();
alert(reg.constructor); /* 'function RegExp() {[native code]}' */

global

Свойство global имеет булевый тип. Оно содержит информацию, указан ли флаг g для регулярного выражения. Это свойство нельзя изменить.

var reg = new RegExp('text', 'g');
alert(reg.global); /* true */

ignoreCase

Свойство ignoreCase имеет булевый тип. Оно содержит информацию, указан ли флаг i для регулярного выражения. Это свойство нельзя изменить.

var reg = new RegExp('text', 'i');
alert(reg.ignoreCase); /* true */

multiline

Свойство multiline имеет булевый тип. Оно содержит информацию, указан ли флаг m для регулярного выражения. Это свойство нельзя изменить.

var reg = new RegExp('text', 'm');
alert(reg.multiline); /* true */

lastIndex

Свойство lastIndex содержит позицию символа в строке, с которого продолжится сопоставление. Это свойство устанавливается только при использовании флага g в регулярном выражении, иначе всегда равно 0. Данное свойство можно перезаписать.

source

Свойство source содержит текст первого аргумента, переданного конструктору RegExp.

var reg = new RegExp('text', 'gim');
alert(reg.source); /* text */

Методы наследников RegExp

exec()

Метод exec() выполняет поиск сопоставлений регулярного выражения в строке, переданной в качестве аргумента. Если сопоставлений не найдено, то метод возвращает null. Если сопоставление найдено, то метод возвращает объект данных и переопределяет свойство lastIndex регулярного выражения (только при использовании флага g). Результирующий объект имеет свойства:

  • [0] - сопоставленная подстрока.
  • [1 … n] - запомненные группы символов, указанные в скобках. Номера групп от 1 до n.
  • ['index'] - позиция символа, с которого начинается сопоставленная подстрока.
  • ['input'] - исходная строка.

Последующая попытка поиска соответствия данного выражения начнёт выполняться с позиции, записанной в свойстве lastIndex (без флага g всегда 0).

var reg = /th(..)/g;

var arr = reg.exec('something this');
alert(arr[0]); // thin
alert(arr[1]); // in
alert(arr.index); // 4
alert(arr.input); // something this
alert(reg.lastIndex); // 8

arr = reg.exec('something this');
alert(arr[0]); // this
alert(arr[1]); // is
alert(arr.index); // 10
alert(arr.input); // something this
alert(reg.lastIndex); // 14

test()

Метод test() проверяет, соответствует ли переданная строка регулярному выражению. Метод возвращает значение булевого типа (true или false). Аналогично методу exec(), данный метод начинает поиск соответствия с позиции, указанной в свойстве lastIndex, и перезаписывает это свойство при использовании глобального поиска.

var reg = /th(..)/g;
var bool = reg.test('something this');
alert(bool); // true
alert(reg.lastIndex); // 8

Этот метод менее информативен, чем exec(), но имеет лучшую производительность.

toString()

Метод toString() возвращает строковое значение объекта.

var reg = new RegExp('reg', 'gim');
alert(reg); // /reg/gim