RegExp.prototype.exec()

Переклад не закінчено. Будь ласка, допоможіть перекласти цю статтю з англійської.

Метод exec() виконує пошук збігів у заданій стрічці. Він повертає масив або null.

Якщо Ви просто використовуєте регулярний вираз, щоб знайти чи є збіг чи немає використовуйте метод RegExp.prototype.test() або метод String.prototype.search().

Синтаксис

regexObj.exec(str)

Параметри

str
Стрічка яка буде перевірятися на збіг за регулярним виразом.

Що повертає

Якщо збіг є, метод  exec() повертає масив і оновлює властивості об'єкту регулярного виразу. На першій позиції повернутого цим методом масиву буде підстрічка яка задовольняє даний регулярний вираз, на наступних позиціях запам'ятовані збіги за допомогою дужок "()"

Якщо збігів немає, метод exec() повертає null.

Опис

Розглянемо наступний приклад:

// Знайти такий збіг: "Швидка рижа" після чого йде 
// довільна кількість знаків потім слово "стрибає"
// Запам'ятати "рижа" і "стрибає"
// Ігнорувати регістр літер (знайде і рижа і РиЖа)
var re = /швидка\s(рижа).+?(стрибає)/ig;
var result = re.exec('Швидка рижа лисиця стрибає через лінивого пса');

Таблиця підсумовує результати виконання скрипта:

Об'єкт Властивість / Індекс Пояснення Приклад
result [0] Стрічка заметчених символів Швидка рижа лисиця стрибає
[1], ...[n ] Запам'ятовані підстрічки, якщо такі є. Їхня кількість не обмежена. [1] = рижа
[2] = стрибає
index Індекс з якого починається збіг. 0
input Початкова стрічка. Швидка рижа лисиця стрибає через лінивого пса
re lastIndex

Індекс з якого починати пошук наступного збігу. Коли прапорець "g" непоставлено, lastIndex буде залишатися 0.

26
ignoreCase Показує чи був використаний прапорець  "i" для ігнорування регістру літер. true
global Показує чи був використаний прапорець "g" для глобального пошуку. true
multiline Показує чи був використаний прапорець "m" для пошуку. false
source Сам регулярний вираз. швидка\s(рижа).+?(стрибає)

Приклади

Пошук наступних збігів

Якщо регулярний вираз використовує прапорець "g", Ви можете використовувати метод exec() багато разів для того, щоб знайти наступні збіги у стрічці з якою працюєте. Якщо Ви так зробите, пошук почнеться з індексу який  заданий властивістю lastIndex ( метод test() також змінює властивість lastIndex ). Для прикладу, припустимо Ви маєте такий скрипт:

var myRe = /ab*/g;
var str = 'abbcdefabh';
var myArray;
while ((myArray = myRe.exec(str)) !== null) {
  var msg = 'Знайдено ' + myArray[0] + '. ';
  msg += 'Наступний пошук почнеться з індексу ' + myRe.lastIndex;
  console.log(msg);
}

Це скрипт виведе таке:

Знайдено abb. Наступний пошук почнеться з індексу 3
Знайдено ab. Наступний пошук почнеться з індексу 9

Увага: Не створюйте об'єкт (через конструктор RegExp)  або літерал регулярного виразу в умові циклу while оскільки це призведе до нескінченного циклу оскільки властивість lastIndex буде перезаписуватися кожен раз на нуль і метод exec ніколи не поверне null. Також перевірте чи поставили прапорець "g" оскільки його відсутність також призведе до нескінченного циклу.

Використання exec() RegExp літералами

Ви можете використовувати метод exec() без створення об'єкту RegExp:

var matches = /(hello \S+)/.exec('This is a hello world!');
console.log(matches[1]);

Це виведе в консоль повідомлення 'hello world!'

Specifications

Specification Status Comment
ECMAScript 3rd Edition (ECMA-262) Standard Initial definition. Implemented in JavaScript 1.2.
ECMAScript 5.1 (ECMA-262)
The definition of 'RegExp.exec' in that specification.
Standard  
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'RegExp.exec' in that specification.
Standard  
ECMAScript 2017 Draft (ECMA-262)
The definition of 'RegExp.exec' in that specification.
Draft  

Browser compatibility

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support (Yes) (Yes) (Yes) (Yes) (Yes)
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support (Yes) (Yes) (Yes) (Yes) (Yes) (Yes)

See also

Мітки документа й учасники

 Востаннє оновлена: bodya17,