Объект RegExp в JavaScript
Создание регулярного выражения
Объект-конструктор RegExp
используется для создания объекта регулярного выражения. Регулярное выражение - это шаблон, которому должна удовлетворять строка или её часть. Такие шаблоны используются, например, для проверки введённых в форму данных (действительно ли введён e-mail и т.п.).
Объект регулярного выражения создаётся из переданных строковых аргументов.
new RegExp(шаблон, флаги)
Также для создания регулярного выражения может использоваться короткая запись:
/шаблон/флаги
- шаблон
- Основная часть регулярного выражения. Шаблон текста, написанный по определённым правилам.
- флаги
- Специальные символы, определяющие свойства регулярного выражения.
Нижеприведенные записи идентичны:
var reg = new RegExp('абв', 'i'); /* или */ var reg = /абв/i;
Такая запись не только уменьшает код, но и улучшает его производительность. JavaScript обработает такое регулярное выражение всего один раз перед выполнением скрипта, а созданное с помощью конструктора выражение обрабатывается во время выполнения скрипта. Это особенно имеет значение, если регулярное выражение создаётся внутри больших циклов. Однако, если само выражение еще не известно на стадии написания скрипта или может меняться (то есть используются переменные), тогда необходимо использовать конструктор.
Шаблон регулярного выражения представляет собой набор простых и специальных символов. Например, выражение /thin/
соответствует любой строке, в которой имеется последовательность символов thin
(something
и т.п.). Это пример простого шаблона. Обычно в практике требуются более сложные шаблоны: соответствие именно началу или концу строки, использование определенного регистра букв, наличие или отсутсвие определённых символов в строке. Для написания таких шаблонов используются специальные символы и флаги.
Флаги
Ниже в таблице представлено описание всех флагов для регулярных выражений.
Флаг | Описание |
---|---|
g |
Флаг глобального сопоставления. Используется, чтобы найти все сопоставления строки с указанным шаблоном. Без указания данного флага поиск останавливается после первого найденного сопоставления. |
i |
Флаг игнорирования регистра. Регистр букв не учитывается при сопоставлении. |
m |
Флаг многострочности. Если в строке имеются символы переноса строки ( , ), то каждая строка рассматривается как самостоятельная. |
Специальные символы
В следующих таблицах представлено описание всех специальных символов для регулярных выражений. Они разделены по назначению.
Классы символов
Символ | Описание |
---|---|
. |
Соответствует одному любому символу, кроме символа конца строки ( , , или ). Флаг многострочности не изменяет поведение данного символа./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