Добавляем...


ехес()
Объект RegExp предлагает также метод, называемый exec(). Этот метод используется, когда необходимо проверить, соответствует ли данная строка шаблону, и требуется дополнительная информация о соответствии, например, о начальной позиции в строке, где обнаружено соответствие. Можно также повторно обратиться к этому методу для той же строки, чтобы двигаться по соответствиям дальше и дальше.
   Метод exec() принимает в качестве аргумента строку для проверки и может вызываться в кратком виде с помощью непосредственного вызова имени регулярного выражения как функции. Например, два вызова в следующем примере эквивалентны:

var pattern = /http:.*/;
pattern.exec("http://www.w3c.org/");
pattern(^http://www.w3c.org/");

Метод exec() возвращает массив с множеством свойств. Среди них length (указывает длину массива), input (содержит оригинальную входную строку), index (содержит позицию символа, с которой в строке начинается соответствие) и lastlndex (указывает позицию, где соответствие заканчивается, т.е. где будет начинаться следующий поиск). Следующий сценарий иллюстрирует использование метода exec() и возвращаемых им значений:

var pattern = /кот/; var result = pattern.exec("Это был кот, жирный кот по кличке Руфус.");

document.writeln("result = "+result+"<br />");
document.writeln("result.length = "+result.length+"<br />");
document.writeln("result.index = "+result.index+"<br />");
document.writeln("result.lastlndex = "+result.lastlndex+"<br />");
document.writeln("result.input = "+result.input+"<br />");

Результат выполнения этого фрагмента программного кода будет таким:
result = кот
result.length = 1
result.index = 8
result.lastlndex = 11
result.input = Это был кот, жирный кот по кличке Руфус.

   Возвращаемый массив может содержать более одного элемента, если используются подвыражения. Например, в следующем сценарии используются три заключенные в скобки подвыражения, которые анализируются в массиве отдельно:

var pattern = /(кот) (и) (пес) /;
var result = pattern.exec("Мои кот и пес оба черные.");

document.writeln("result = "tresult);
document.writeln("result.length = "tresult.length);
document.writeln("result.index = "+result.index);
document.writeln("result.lastlndex = "+result.lastlndex);
document.writeln("result.input = "+result.input);

Результат выполнения этого фрагмента программного кода будет таким:
result = кот и пес ,кот,и,пес
result.length = 4
result.index = 4
result.lastlndex = 14
result.input = Мои кот и пес оба черные.

метод exec() размещает всю соответствующую строку в нулевом элементе массива, а подстроки, соответствующие заключенным в скобки подвыражениям, — в последующих элементах.

ехес() и флаг глобальности

   Иногда требуется найти не только первое соответствие шаблону в строке, а все соответствия. Добавление флага глобальности (g) к регулярному выражению указывает на необходимость искать все совпадения, а не только первое (т.е. искать глобально).
   Интерпретация флага глобальности объектами RegExp и String довольно хитроумна. В RegExp он используется для выполнения глобального поиска пошагово, т.е. с помощью анализа каждого последующего совпадения с шаблоном по очереди. В String флаг глобальности используется для выполнения глобального поиска сразу, т.е. с помощью анализа всех совпадений с шаблоном в одном обращении к функции. Использование флага глобальности в методах String мы рассмотрим в следующем разделе.
   Чтобы продемонстрировать разницу между регулярными выражениями с флагом глобальности и без него, рассмотрим следующий простой пример:

var lucky = "Счастливыми числами являются 3, 14 и 27";
var pattern = /\d+/;
document.writeln("Без флага глобальности получаем:");
document.writeln(pattern.exec(lucky) ) ;
document.writeln(pattern.exec(lucky));
document.writeln(pattern.exec(lucky));
pattern = /\d+/g;
document.writeln("С флагом глобальности получаем:");
document.writeln(pattern.exec(lucky)) ;
document.writeln(pattern.exec(lucky)); document.writeln(pattern.exec(lucky) );

Как видно результата при наличии флага глобальности exec() начинает поиск с позиции, следующей за найденным соответствием. Без флага глобальности exec() всегда возвращает первую найденную часть строки.

Результат выполнения этого фрагмента программного кода будет таким:
Без флага глобальности получаем:
3
3
3
С флагом глобальности получаем:
3
14
27

   Как выполняется глобальный поиск? Напомним, что exec() устанавливает свойство lastlndex как в возвращаемом массиве, так и в объекте класса RegExp, в результате чего указатель соответствует символу, следующему непосредственно за подстрокой, которая только что была найдена. При последующих вызовах метода exec() поиск в строке будет начинаться с позиции, указанной свойством lastlndex. Если соответствия не найдено, значение lastlndex устанавливается равным нулю.
   При типичном использовании exec() выполняется цикл по всем подстрокам, соответствующим регулярному выражению, с получением полной информации о каждом совпадении. Примером такого использования является следующий фрагмент программного кода, в котором находятся слова в заданной строке. Результат (при условии заключения указанного программного кода в рамки дескриптора <рге>) показан ниже. Обратите внимание на то, как в соответствии с вышеприведенным обсуждением меняются значения lastlndex.

var sentence = "Ну очень интересное предложение.";
var pattern = /\В[а-яА-Я0-9_]+\B/g; // распознает слова, глобально
var token = pattern.exec(sentence); // поиск первого соответствия
while (token != null)
{
// если соответствие найдено, выводится информация о нем document.writeln("Найдено " + token[0] + " ");
document.writeln("\ttoken.input = " + token.input);
document.writeln("\ttoken.input = " + token.index);
document.writeln("\ttoken.lastlndex = " + token.lastlndex + "\n ");
token = pattern.exec(sentence); // поиск следующего соответствия
}

Результат выполнения этого фрагмента программного кода будет таким:
Найдено Ну
   token.input = Ну очень интересное предложение.
   token.index = 0
   token.lastlndex = 2

Найдено очень
   token.input = Ну очень интересное предложение.
   token.index = 3
   token.index = 8

Найдено интересное
   token.input = Ну очень интересное предложение.
   token.index = 9
   token.lastlndex = 19

Найдено предложение
   token.input = Ну очень интересное предложение.
   token.index = 20
   token.lastlndex = 31


   Есть одно предостережение, касающееся использования метода exec(). Если поиск прекращается до последнего соответствия, необходимо вручную установить нулевое значение для свойства lastlndex регулярного выражения. Если этого не сделать, в следующий раз, когда придется использовать это регулярное выражение, поиск автоматически начнется с позиции lastlndex, а не с начала строки.
назад: compile() далее: Свойства RegExp


добавить комментарий
(без перезагрузки и регистрации)


10 случайных разделов

Что ищем на сайте ?


Примеры кода на сайте







@ 2008-2011 Amber
При использовании материалов ссылка на сайт обязательна
Яндекс.Метрика