В этой главе мы обсудим такой инструмент – регулярные выражения. Это способ описывать шаблоны в строковых данных. Они создают небольшой отдельный язык, который входит в JavaScript и во множество других языков и инструментов.
Регулярки одновременно очень странные и крайне полезные. Их синтаксис загадочен, а программный интерфейс в JavaScript для них неуклюж. Но это мощный инструмент для исследования и обработки строк. Разобравшись с ними, вы станете более эффективным программистом.
Создаём регулярное выражение
Регулярка – тип объекта. Её можно создать, вызвав конструктор >RegExp
, или написав нужный шаблон, окружённый слэшами.
>var re1 = new RegExp("abc");
>var re2 = /abc/;
Оба этих регулярных выражения представляют один шаблон: символ “a”, за которым следует символ “b”, за которым следует символ “c”.
Если вы используете конструктор >RegExp
, тогда шаблон записывается как обычная строка, поэтому действуют все правила относительно обратных слэшей.
Вторая запись, где шаблон находится между слэшами, обрабатывает обратные слэши по-другому. Во-первых, так как шаблон заканчивается прямым слэшем, то нужно ставить обратный слэш перед прямым слэшем, который мы хотим включить в наш шаблон. Кроме того, обратные слэши, не являющиеся частью специальных символов типа >\n
, будут сохранены (а не проигнорированы, как в строках), и изменят смысл шаблона. У некоторых символов, таких, как знак вопроса или плюс, есть особое значение в регулярках, и если вам нужно найти такой символ, его также надо предварять обратным слэшем.
>var eighteenPlus = /eighteen\+/;
Чтобы знать, какие символы надо предварять слэшем, вам надо выучить список всех специальных символов в регулярках. Пока это нереально, поэтому в случае сомнений просто ставьте обратный слэш перед любым символом, не являющимся буквой, числом или пробелом.
У регулярок есть несколько методов. Простейший – >test
. Если передать ему строку, он вернёт булевское значение, сообщая, содержит ли строка вхождение заданного шаблона.
>console.log(/abc/.test("abcde"));
>// → true
>console.log(/abc/.test("abxde"));
>// → false
Регулярка, состоящая только из неспециальных символов, просто представляет собой последовательность этих символов. Если >abc
есть где-то в строке, которую мы проверяем (не только в начале), >test
вернёт >true
.
Выяснить, содержит ли строка >abc
, можно было бы и при помощи >indexOf
. Регулярки позволяют пройти дальше и составлять более сложные шаблоны.
Допустим, нам надо найти любой номер. Когда мы в регулярке помещаем набор символов в квадратные скобки, это означает, что эта часть выражения совпадает с любым из символов в скобках.