Книга: JavaScript. Подробное руководство, 6-е издание

10.3.2. Методы RegExp

10.3.2. Методы RegExp

Объекты RegExp определяют два метода, выполняющие поиск по шаблону; они ведут себя аналогично методам класса String, описанным выше. Основной метод класса RegExp, используемый для поиска по шаблону, - ехес(). Он похож на упоминавшийся метод match() класса String, за исключением того, что является методом класса RegExp, принимающим в качестве аргумента строку, а не методом класса String, принимающим аргумент RegExp. Метод ехес() выполняет регулярное выражение для указанной строки, т. е. ищет совпадение в строке. Бели совпадение не найдено, метод возвращает null. Однако если соответствие найдено, он возвращает такой же массив, как массив, возвращаемый методом match() для поиска без флага g. Нулевой элемент массива содержит строку, соответствующую регулярному выражению, а все последующие элементы - подстроки, соответствующие всем подвыражениям. Кроме того, свойство index содержит номер позиции символа, которым начинается соответствующий фрагмент, а свойство input ссылается на строку, в которой выполнялся поиск.

В отличие от match(), метод ехес() возвращает массив, структура которого не зависит от наличия в регулярном выражении флага g. Напомню, что при передаче глобального регулярного выражения метод match() возвращает массив найденных соответствий. А ехес() всегда возвращает одно соответствие, но предоставляет о нем полную информацию. Когда ехес() вызывается для регулярного выражения, содержащего флаг g, метод устанавливает свойство lastlndex объекта регулярного выражения равным номеру позиции символа, следующего непосредственно за найденной подстрокой. Когда метод ехес() вызывается для того же регулярного выражения второй раз, он начинает поиск с символа, позиция которого указана в свойстве lastlndex. Если ехес() не находит соответствия, свойство lastindex получает значение 0. (Вы также можете установить lastlndex в ноль в любой момент, что следует делать во всех тех случаях, когда поиск завершается до того, как будет найдено последнее соответствие в одной строке, и начинается поиск в другой строке с тем же объектом RegExp.) Это особое поведение позволяет вызывать exec() повторно для перебора всех соответствий регулярному выражению в строке. Например:

var pattern = /Java/g;
var text = "JavaScript - это более забавная штука, чем Java!";
var result;
while((result = pattern.exec(text)) != null) {
  alert("Найдено '" + result[0] + ..... +
  в позиции " + result.index +
         "; следующий поиск начнется с " + pattern.lastlndex);
}

Еще один метод объекта RegExp - test(), который намного проще метода ехес(). Он принимает строку и возвращает true, если строка соответствует регулярному выражению:

var pattern = /java/і;
pattern.test("JavaScript"); // Вернет true

Вызов test() эквивалентен вызовуexec(), возвращающему true, если exec() возвращает не null. По этой причине метод test() ведет себя так же, как метод ехес() при вызове для глобального регулярного выражения: он начинает искать указанную строку с позиции, заданной свойством lastlndex, и если находит соответствие, устанавливает свойство lastlndex равным номеру позиции символа, непосредственно следующего за найденным соответствием. Поэтому с помощью метода test() можно так же сформировать цикл обхода строки, как с помощью метода ехес().

Методы search(), replace() и match() класса String не используют свойство lastlndex, в отличие от методов ехес() и test(). На самом деле методы класса String просто сбрасывают lastlndex в 0. Если метод ехес() или test() использовать с шаблоном, в котором установлен флаг g, и выполнить поиск в нескольких строках, то мы должны либо найти все соответствия в каждой строке, чтобы свойство lastlndex автоматически сбросилось в ноль (это происходит, когда последний поиск оказывается неудачным), либо явно установить свойство lastlndex равным нулю. Если этого не сделать, поиск в новой строке может начаться с некоторой произвольной позиции, а не с начала. Если регулярное выражение не включает флаг g, то вам не придется беспокоиться об этом. Имейте также в виду, что в ECMAScript 5, когда интерпретатор встречает литерал регулярного выражения, он создает новый объект RegExp, со своим собственным свойством lastlndex, что снижает риск использования «левого» значения lastlndex по ошибке.

Оглавление книги

Оглавление статьи/книги

Генерация: 0.790. Запросов К БД/Cache: 2 / 0
поделиться
Вверх Вниз