В отличие от 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 по ошибке.
11
Подмножества и расширения JavaScript
До сих пор в книге описывалась официальная версия языка JavaScript, соответствующая стандартам ECMAScript 3 и ECMAScript 5. В этой главе, напротив, будет идти речь о подмножествах и надмножествах языка JavaScript. Подмножества языка были определены, по большей части, для обеспечения более высокого уровня безопасности: сценарий, использующий только безопасное подмножество языка, может использоваться без опаски, даже если он был получен из непроверенного источника, такого как рекламный сервер. В разделе 11.1 описываются некоторые из этих подмножеств.
Читать дальше
Конец ознакомительного отрывка
Купить книгу