Регулярные выражения являются мощным средством для работы с текстом. Используя регулярные выражения, можно в несколько раз сократить объем кода. Сейчас регулярные выражения используются многими текстовыми редакторами и утилитами для поиска и изменения текста на основе выбранных правил — сжатого описания некоторого множества строк, без необходимости перечисления всех элементов этого множества.
В JavaScript регулярные выражения являются объектами, которые принимают текс на вход методов exec
и test
объекта RegExp
или сами являются параметрами методов match
, replace
, search
и split
объекта String
.
Регулярное выражение (regular expression) — средство для обработки строк или последовательность символов, определяющее так называемый шаблон (pattern) текста.
Паттерн или образец (pattern) — задает правило поиска, также иногда называют шаблоном, маской.
Метасимволы или спецсимволы — операции специального синтаксиса использующегося при составлении шаблонов. Это так называемые команды регулярного выражения.
Модификаторы — задают дополнительные условия поиска, такие как учет регистра и области поиска.
Создать регулярное выражение можно следующими способами:
re = /abc\d+/Инициализаторы объектов выполняют компиляцию регулярного выражения при вычислении скрипта. Если регулярное выражение является константным, инициализатор можно использовать для повышения производительности.
re = new RegExp("abc\d+")или
re = new RegExp(/abc\d+/)При использовании функции-конструктора компиляция регулярного выражения происходит на этапе прогона. Если известно, что паттерн регулярного выражения будет изменяться, или если Вы заранее не знаете паттерн и он, например, задается путем пользовательского ввода. После определения регулярного выражения исходное значение изменяется, то можно использовать метод compile для компиляции нового регулярного выражения для более эффективного многократного использования.
Паттерн регулярного выражения может состоять из простых символов, специальных символов или комбинации простых и специальных. Например, паттерн /expression javascript/
, содержит только простые символы. Выражение вида /\d*/
, содержит только специальные символы. Шаблон /expression javascript\d*/
, содержит комбинацию простых и специальных символов.
При использовании простых символов для них ищется прямое соответствие. Например, /expression javascript/
совпадает с комбинацией символов в строке только тогда, когда подстрока 'expression javascript' встречается именно в таком порядке и именно с таким количеством пробелов между словами.
Совпадение будет найдено в строках "I'm studing expression javascript" и "I'm studing expression javascript for two days". В обоих случаях строка содержит подстроки 'expression javascript'. Но в строке "I'm studing expression in javascript" совпадений нет, потому что она не содержит в себе точной последовательности символов соответствующей 'expression javascript'.
Использование спецсимволов дает большую гибкость, позволяя задать некое множество простых символов используемых при поиске. Например, паттерн /javascript\d*|php\d*/
совпадает с любой подстрокой, в которой есть слово 'javascript' или 'php', за которым следует 0 или более цифр (|
означает логическое или, \d
- число, а *
0 или более раз).
Так будет найдено 'javascript' для строки "I'm studing javascript" и подстрока 'javascript1' для "I'm studing javascript1". Для строк "I'm studing php" и "I'm studing php50" будут найдены соответственно подстроки 'php' и 'php50'.
В таблице дан полный список - описание специальных символов, которые могут использоваться в регулярных выражениях.
Значение | Описание |
---|---|
\ | Изменяет интерпретацию последующего символа:
/d/ совпадает с символом 'd'. При помещении символа \ перед d , то есть /\d/ , символ становится специальным, обозначая цифру.
* это специальный символ, который означает 0 или более совпадений с вхождением предыдущего символа; например, /a*/ означает 0 или более символов а. Для интерпретации * литерально, т.е. как обычного символа, необходимо поставить перед ним \ ; например, /a\*/ совпадает с 'a*'.
|
^ | Совпадает с начало ввода или строки. Например,/^J/ не совпадает с 'J' в строке "Her name is Jane," но совпадает с первой 'J' в строке "Jane Jason". |
$ | Совпадает с концом ввода или строки. Например,/t$/ не совпадает с 't' в "Pit Jason", но совпадает в "His name is Pit". |
* | Предшествующий символ совпадает 0 или более раз. Например,/go*/ совпадает с 'goo' в "A good sample" и с 'g' в "A general sample", но не совпадает в "A book". |
+ | Предшествующий символ совпадает 1 или более раз. Эквивалентно /go+/ совпадает с 'goo' в "good", но не совпадает в "general". |
? | Предшествующий символ совпадает 0 или 1 раз. Например,/go?/ совпадает с 'go' для "go to" или "good", и с 'g' в "general". |
{n} | Предшествующий символ совпадает точно n раз. Где n это положительное целое. Например,/go{2}/ совпадает с 'goo' в "good" или "gooood", но не совпадает в "go". |
{n,} | Предшествующий символ совпадает n и более раз. Где n это положительное целое. Например,/go{2,}/ совпадает с 'goo' в "good" и с 'goooo' в "gooood", но не совпадает в "go". |
{n,m} | Предшествующий символ совпадает как минимум n, и максимум m раз. Где n и m это положительные целые числа. Например,/go{1,3}/ совпадает с 'go' в "go to", с 'goo' в "good". В "gooood" совпадает с 'gooo', т.е. с 'g' и только первыми тремя 'o', а не со всеми. |
(x) | Совпадает с x и запоминает совпадение. Где x - выражение или набор простых символов. Например,/(good)/ совпадает (и запоминает) 'good' в "a good sample". Более подробно этот вопросс рассматривается в пункте "Использование совпадений подстрок в скобках". |
(?:x) | Совпадает с x, и не запоминает совпадение. Используется для группировки символов. Например,/(?:java|action)script/ эквивалентно /javascript|actionscript/ . Совпадает с 'javascript' в строке "studing language javascript" и с 'actionscript' в строке "studing language actionscript". |
(?=x) | Осуществляет поиск соответствия x наперед, и не запоминает совпадение. Например,/Java (?=EE|SE beta)/ совпадает с 'Java' в строке "Java EE" и в строке "Java SE beta", но нет совпадений в строке "Java ME". |
(?!x) | Осуществляет поиск несоответствия x наперед, и не запоминает совпадение. Например,/Java (?!EE|SE beta)/ совпадает с 'Java' в строке "Java ME" и не совпадает для строк "Java EE" и "Java SE beta". |
. | Совпадает с любым одиночным символом, кроме символа новой строки. Например,/.a/ совпадает с 'ca' в "car" и с 'ba' в "a baby", но не с 'a' стоящей в начале строки. Также совпадает с '2a' в "number 2a" или "v2a". |
x|y | Совпадает с x или с y. Например,/javascript|php/ совпадает с 'javascript' в "studing javascript" и с 'php' в "studing php" |
[xyz] | Совпадает с любым одним из символов находящимся в скобках. Где xyz любые символы паттерна. Можно специфицировать диапазон символов, используя дефис. Например,/[abcd]/ эквивалентно /[a-d]/ . Совпадает с 'b' в "brisket" и с 'c' в "ache". |
[^xyz] | Совпадение со всеми символами, кроме находящихся в скобках. Можно специфицировать диапазон символов, используя дефис. Например,[^abc] это то же самое, что [^a-c] . Первоначально совпадает с 'r' в "brisket" и с 'h' в "chop". |
[\b] | Совпадает с BackSpace. (Не путать с \b .) |
\b | Совпадает с границей слова - пробел/space или символ новой строки. (Не путать с /\bg/ совпадает с 'g' в "good", а /g\b/ совпадает с 'g' в "a good life", но не совпадает в "together" |
\B | Совпадает с не границей слова, такой как пробел/space или символ новой строки. Например,/\Bg/ не совпадает с 'g' в "good" и в "a good life", но совпадает в "together". |
\cX | Совпадает с управляющим символом в строке. Где X это управляющий символ. Например,/\cS/ совпадает с комбинацией Ctrl-S. |
\d | Совпадает с цифрой. Эквивалентно /\d\d\d/ совпадает с '101' в строке "plane F-101". |
\D | Совпадает с не-цифрой. Эквивалентно /\D/ совпадает с 'F' в строке "F-101". |
\f | Совпадает с form-feed - символом перевода формата. |
\n | Совпадает с linefeed - символом перевода строки. |
\r | Совпадает с carriage return - символом возврата каретки. |
\s | Совпадает с одиночным пробельным символом, включая space, tab, form feed, line feed. Эквивалентно /\sg/ совпадает с ' go' в "a good day". |
\S | Совпадает с одиночным символом, отличным от пробела. Эквивалентно /\Sg/ не совпадает в "a good day", но совпадает c 'og' в "together". |
\t | Совпадает с tab - символом табуляции. |
\v | Совпадает с vertical tab - символом вертикальной табуляции. |
\w | Совпадает с любым алфавитно-цифровым символом, включая символ подчёркивания. Эквивалентно /\w/ совпадает с 'J' в "Java", с 'v' в "version 1.4" и с '2' в "#245." |
\W | Совпадает с любым не-алфавитно-цифровым символом. Эквивалентно /\W/ совпадает с '%' в "100%." |
\n | Обратная ссылка на последнее совпадение подстроки с n в скобках из регулярного выражения (с учётом левых скобок). Где n это положительное целое. Если количество левых скобок меньше числа n, то эквивалентно /blue(,) red\1/ совпадает с 'blue, red,' в "green, blue, red, silver" |
\0octal | Где octal это 8-ричное значение символа. Например,/\0144/ эквивалентно символу 'd'. |
\xhex | Где hex это 16-ричное значение символа, состоящее из двух цифр. Например,/\x70/ эквивалентно символу 'p'. |
\uhex | Где hex это 16-ричное значение символа Unicode, состоящее из четырех цифр.. |
При создании регулярного выражения можно задавать дополнительные опции поиска, также иногда называемые модификаторами. Они ставятся в конце шаблона регулярного выражения, после слеша, или как второй параметр конструктора при создании объекта RegExp
и имеют следующие значения:
re = /abc\d+/iили
re = new RegExp(/abc\d+/i)или
re = new RegExp("abc\d+", "i")Совпадает с подстрокой 'abc12' в "sample abc12" и с 'aBC12' в "sample aBC12", без учета регистра. Все три выражения эквивалентны друг другу и отличаются лишь способом их задания.
re = new RegExp("abc\d+", "g")Совпадает не только с 'abc12', но и с 'abc34', и с 'abc6' для строки "sample abc12 abc34 abc6 and next". Модификатор
g
также может быть задан несколькими способами аналогично i
.
Так же имеется возможность задания сразу нескольких опций поиска одновременно. Например, глобальный поиск без учета регистра:
re = new RegExp("abc\d+", "ig")или
re = /abc\d+/ig
Работать с регулярными выражениями в javascript можно, используя методы объекта RegExp
или используя методы объекта String
. Методы объекта RegExp
принимают на вход строку, к которой собственно и будет применяться данное регулярное выражение. А методы для работы с регулярными выражениями объекта String
наоборот, принимают на вход регулярное выражение и применяют его к строке вызвавшей метод.
Название | Описание |
---|---|
Свойства | |
lastIndex | Индекс последнего совпадения. Это свойство устанавливается, только если регулярное выражение использует опцию g . |
source | Текст паттерна. |
Методы | |
exec | Выполняет поиск совпадения. Возвращает массив информации или null при отсутствии совпадения. |
test | Тестирует на наличие совпадений в строке. Возвращает true или false. |
Назначение: возвращает индекс последнего совпадения. Используется при определении позиции начала поиска при следующей итерации. Устанавливается только при использовании регулярным выражением опции g
.
Синтаксис:
objRegExp.lastIndex
objRegExp - экземпляр объекта RegExp
.
Возвращаемое значение: целое число.
Пример:
re = RegExp(/d+/g);
re.exec("abcd abcd");
vLastIndex = re.lastIndex;
В данном случае переменная vLastIndex
будет равна 4. При следующем вызове exec
, поиск будет начинаться с позиции равной lastIndex
.
Так например, следующий пример позволяет найти индексы всех совпадений.
re = RegExp(/d+/g);
indexArr = new Array();
while (re.exec("abcd abcd add bd")) {;
vLastIndex = re.lastIndex;
indexArr.push(vLastIndex);
}
В этом примере, после выполнения цыкла, массив indexArr
будет содержать следующие значения [4, 9, 13, 16].
Назначение: возвращает значение текста паттерна.
Синтаксис:
objRegExp.source
objRegExp - экземпляр объекта RegExp
.
Возвращаемое значение: строка.
Пример:
re = RegExp(/abc+/);
vLastIndex = re.source;
В данном случае переменна vLastIndex
будет содержать значение "abc+".
Назначение: выполняет поиск совпадения в строке на основании паттерна.
Синтаксис:
objRegExp.exec(aInputText);
objRegExp - экземпляр объекта RegExp
.
aInputText - текст, в котором будет осуществляться поиск.
Возвращаемое значение: массив совпадений или null, если совпадений не найдено.
Пример:
vArr = /a(b)(c+)/i.exec("sample abcCcc");
vAllSame = vArr[0];
vFirstRem = vArr[1];
vSecondRem = vArr[2];
В данном случае переменная vAllSame
равна 'abcCcc', vFirstRem
равна 'b' - совпадению в первых скобках, а vSecondRem
, соответственно, равна 'cCcc' - совпадению во вторых скобках.
Назначение: выполняет проверку наличия совпадения в строке на основании паттерна.
Синтаксис:
objRegExp.test(aInputText);
objRegExp - экземпляр объекта RegExp
.
aInputText - текст, в котором будет осуществляться поиск.
Возвращаемое значение: логическое значение, true - совпадения найдены, false - не найдены.
Пример:
re = new RegExp(/a(b)(c+)/i);
isFind = re.test("sample abcCcc");
if (isFind) {
alert("Найдено совпадение");
}
В данном случае переменная isFind
будет равна true, так как есть совпадение с подстрокой 'abcCcc' .
Название | Описание | Методы |
---|---|
match | Выполняет поиск совпадения. Возвращает массив информации, или null при отсутствии совпадения. |
search | Тестирует на наличие совпадений в строке. Возвращает индекс совпадения или -1, если поиск завершился неудачно. |
replace | Выполняет поиск совпадения в строке и заменяет найденные подстроки замещающей подстрокой. |
split | Разделяет строку на массив подстрок, используя регулярное выражение или фиксированную строку в качестве значения разделителя. |
Назначение: выполняет поиск совпадений в строке на основании паттерна.
Синтаксис:
objString.match(aPattern);
objString - текст, в котором будет осуществляться поиск. Является экземпляром объекта String
.
aPattern - паттерн (шаблон) для поиска.
Возвращаемое значение: массив совпадений или null если совпадений не найдено.
Пример:
re = new RegExp(/abc+/gi);
vStr = "sample abcCcc aBc and next";
vArr = vStr.match(re);
vFirstSame = vArr[0];
vSecondSame = vArr[1];
В данном случае переменная vFirstSame
равна 'abcCcc', vSecondSame
равна 'aBc'.
Назначение: выполняет поиск первого совпадения в строке на основании паттерна.
Синтаксис:
objString.search(aPattern);
objString - текст, в котором будет осуществляться поиск. Является экземпляром объекта String
.
aPattern - паттерн (шаблон) для поиска.
Возвращаемое значение: положительное целое число или -1, если совпадений не найдено.
Пример:
vStr = "sample abccc abc and next";
vFirstIndex = vStr.search(/abc+/);
В данном случае переменная vFirstIndex
равна 7.
Назначение: выполняет поиск и замену совпадений в строке на основании паттерна
Синтаксис:
objString.replace(aPattern, aSubStr);
objString - текст, в котором будет осуществляться поиск и замена. Является экземпляром объекта String
.
aPattern - паттерн (шаблон) для поиска.
aSubStr - текст, которым будет заменено найденное совпадение.
Возвращаемое значение: строка с измененным текстом или с исходным текстом, если совпадений не найдено.
Пример:
vStr = "sample abccc1 abc2 and next";
vNewStr = vStr.replace(/abc+/g,"dfg");
В данном случае переменная vNewStr
будет равна "sample dfg1 dfg2 and next".
Назначение: выполняет разбиение строки на подстроки, используя в качестве разделителя паттерн или фиксированную строку.
Синтаксис:
objString.split(aPattern, aPattern|aSpliter);
objString - текст для разбиения. Является экземпляром объекта String
.
aPattern - паттерн (шаблон) разделителя.
aSpliter - фиксированная строка - разделитель.
Возвращаемое значение: массив подстрок. Если совпадений не найдено, то первый элемент массива содержит исходный текст.
Пример:
vStr = "1,2,15";
vArr = vStr.split(",");
vStr = "2*5+9/4";
vArr = vStr.split(/([\*\+/-])/);
В первом примере, для разбиения используется фиксированный разделитель ",". Результирующий массив vArr
будет содержать разделенные подстроки: vArr[0]
равно '1', vArr[1]
равно '2', vArr[2]
равно '15'.
Во втором примере происходит полный разбор арифметического выражения на составляющие. Для разбиения используется регулярное выражение, которое совпадает с любым из знаков арифметических операций: умножить, сложить, поделить и отнять. Скобки в паттерне регулярного выражения нужны для запоминания самого разделителя. В итоге, результирующий массив vArr
, будет содержать все выражение почленно вместе с арифметическими операциями: vArr[0]
равно '2', vArr[1]
равно '*', vArr[2]
равно '5' и так далее. Т.е. vArr
содержит ['2', '*', '5', '+', '9', '/', '4'].
Включение скобок в паттерн регулярного выражения вызывает запоминание соответствующего подсовпадения. Например, /a(b)cc/ совпадает с символами 'abcc' и запоминает 'b'. Для последующего использования этих запомненных подсовпадений используйте свойства $1, ..., $9 объекта RegExp
или элементы [1], ..., [n] объекта Array
, возвращаемого при поиске совпадений.
Количество подстрок в скобках не ограничено, но предопределённый объект RegExp
хранит только последние 9 подстрок, а массив содержит все.
Пример использования свойств $1, ..., $9 объекта RegExp
:
re = RegExp(/(c)d(f)/);
re.exec("sample cdf");
vFirstRem = RegExp.$1;
vSecondRem = RegExp.$2;
В данном примере переменная vFirstRem
равна 'c', а vSecondRem
равна 'f'.
Пример использования массива совпадений:
re = RegExp(/(c)d(f)/);
vArr = re.exec("sample cdf");
vAllSame = vArr[0];
vFirstRem = vArr[1];
vSecondRem = vArr[2];
В данном примере переменная vFirstRem
будет равна 'c', vSecondRem
равна 'f', а переменная vAllSame
содержит 'cdf - полную подстроку совпадения .
Можно привести сотни примеров использования регулярных выражений, которые безусловно будут очень полезны; но я считаю, что лучше один раз попробовать чем десять раз прочитать о том, как это должно быть.
С этой целью был создан, так называемый, конструктор регулярных выражений. В нем можно испробовать не только примеры регулярных выражений, приведенных на этом сайте, но и регулярные выражения созданные самостоятельно.
Я попытался максимально подробно изложить материал, касающийся регулярных выражений в JavaScript. Здесь изложена основная информация необходимая для начального понимания и начала использования регулярных выражений.
Но при написании этого материала и более подробном изучении специфики использования регулярных выражений, были выявлены некоторые особенности. Особенности использования регулярных выражений, а также многое другое можно почитать в разделе "Статьи".