ECMAScript | RegExp.prototype.exec ( string )

Выполняет сопоставление регулярного выражения из строки string с регулярным выражением и возвращает объект массива Array, содержащий результаты сопоставления, или null, если строка string не сопоставима.

Строка ToString(string) ищет вхождения шаблона регулярного выражения следующим образом:

1. Пусть R будет значением этого this.
2. Выполнить ? RequireInternalSlot(R, [[RegExpMatcher]]).
3. Пусть S будет ? ToString(string).
4. Вернуть ? RegExpBuiltinExec(R, S).

 

RegExpExec ( R, S ) — regular expression execution

Абстрактная операция RegExpExec (Выполнение регулярного выражения) принимает аргументы R и S. При вызове она выполняет следующие шаги:

1. Утверждено: тип Type(R) - это Объект.
2. Утверждено: тип Type(S) - это Строка.
3. Пусть exec будет ? получить Get(R, "exec").
4. Если IsCallable(exec) является true (истинно), то
   а. Пусть result будет ? вызов Call(exec, R, «S»).
   b. Если тип Type(result) не является ни Object, ни Null, генерировать исключение TypeError.
   c. Вернуть результат result.
5. Выполнить ? RequireInternalSlot(R, [[RegExpMatcher]]).
6. Вернуть ? RegExpBuiltinExec(R, S).
Примечание

Если вызываемое свойство «exec» не найдено, этот алгоритм возвращается к попытке использовать встроенный алгоритм сопоставления RegExp. Это обеспечивает совместимое поведение для кода, написанного для предыдущих выпусков, в которых большинство встроенных алгоритмов, использующих регулярные выражения, не выполняли динамический поиск свойств «exec«.

 

RegExpBuiltinExec ( R, S )

Абстрактная операция RegExpBuiltinExec (Выполнение встроенного регулярного выражения) принимает аргументы R и S. При вызове она выполняет следующие шаги:

1. Утверждено: R - это инициализированный экземпляр RegExp.
2. Утверждено: Тип Type(S) - Строка.
3. Пусть длина length будет количеством кодовых единиц в S.
4. Пусть lastIndex будет (? ToLength(? Get(R, "lastIndex"))).
5. Пусть flags будет R.[[OriginalFlags]].
6. Если flags содержит "g", пусть global будет true (истина); иначе пусть global будет false (ложь).
7. Если flags содержит "y", пусть sticky будет true (истина); иначе пусть sticky будет false (ложь).
8. Если global является false и sticky является false, установите lastIndex равным 0.
9. Пусть сопоставитель matcher будет R.[[RegExpMatcher]].
10. Если flags содержит «u», пусть fullUnicode будет true (истина); иначе пусть fullUnicode будет false (ложь).
11. Пусть matchSucceeded будет false.
12. Повторите, пока matchSucceeded имеет значение false,
   а. Если lastIndex > length, то
      i. Если global является true (истинно) или sticky является true (истинно), то
         1. Выполнить ? установить Set(R, "lastIndex", +0𝔽, true).
      ii. Вернуть null.
   b. Пусть r - это matcher(S, lastIndex).
   c. Если r - это неудача failure, то
      i. Если sticky является true (истинно), то
         1. Выполнить ? установить Set(R, "lastIndex", +0𝔽, true).
         2. Вернуть null.
      ii. Установите lastIndex на AdvanceStringIndex(S, lastIndex, fullUnicode).
   d. Еще,
      i. Утверждено: r - это состояние State.
      ii. Установите для matchSucceeded значение true.
13. Пусть e будет значением endIndex для r.
14. Если fullUnicode является true (истинно), то
   а. e - это индекс в списке входных символов Input, производный от S, сопоставленный с помощью сопоставителя matcher. Пусть eUTF будет наименьшим индексом в S, который соответствует символу в элементе e из Input. Если e больше или равно количеству элементов в Input, то eUTF - это количество кодовых единиц в S.
   b. Установите e на eUTF.
15. Если global - true или sticky - true, то
   а. Выполнить ? установите Set(R, "lastIndex", 𝔽(e), true).
16. Пусть n будет количеством элементов в Списке захвата captures от r. (Это то же значение, что и NcapturingParens 22.2.2.1.)
17. Утверждено: n < 232 - 1.
18. Пусть А будет ! ArrayCreate(n + 1).
19. Утверждено: математическое значение свойства "length" A равно n + 1.
20. Выполнить ! CreateDataPropertyOrThrow(A, "index", 𝔽(lastIndex)).
21. Выполнить ! CreateDataPropertyOrThrow(A, "index", S).
22. Пусть matchedSubstr будет подстрокой S от lastIndex до e.
23. Выполнить ! CreateDataPropertyOrThrow(A, "0", matchedSubstr).
24. Если R содержит любое GroupName, то
   а. Пусть groups будут  ! OrdinaryObjectCreate(null).
25. Иначе,
   а. Пусть группы groups не определены - являются undefined.
26. Выполнить ! CreateDataPropertyOrThrow(A, "groups", groups).
27. Для каждого целого числа i такого, что i ≥ 1 и in, в порядке возрастания выполните
   а. Пусть captureI будет i-м элементом Списка захватов captures из r.
   b. Если captureI является undefined(не определен), пусть captureValue является undefined(не определен).
   c. Иначе, если fullUnicode является true (истинно), то
      i. Утверждено: captureI - это Список кодовых точек.
      ii. Пусть captureValue будет ! CodePointsToString(captureI).
   d. Еще,
      i. Утверждено: fullUnicode является false (ложно).
      ii. Утверждено: captureI - это Список кодовых единиц.
      iii. Пусть captureValue будет значением String, состоящим из кодовых единиц captureI.
   е. Выполнить ! CreateDataPropertyOrThrow(A, ! ToString(𝔽(i)), capturedValue).
   f. Если i-й захват R был определен с помощью GroupName, то
      i. Пусть s будет CapturingGroupName соответствующего RegExpIdentifierName.
      ii. Выполнить ! CreateDataPropertyOrThrow(groups, s, capturedValue).
28. Вернуть А.

AdvanceStringIndex ( S, index, unicode )

Абстрактная операция AdvanceStringIndex (Предварительный указатель строки) принимает аргументы S (строка), индекс index (неотрицательное целое число) и юникод unicode (логическое значение). При вызове он выполняет следующие шаги:

1. Утверждено: индекс ≤ 253 - 1.
2. Если unicode равен false, вернуть index + 1.
3. Пусть длина length будет количеством кодовых единиц в S.
4. Если index + 1 ≥ length, вернуть index + 1.
5. Пусть cp будет ! CodePointAt(S, index).
6. Вернуть index + cp.[[CodeUnitCount]].

Информационные ссылки

Стандарт ECMAScript — Раздел «RegExp.prototype.exec ( string )» — https://tc39.es/ecma262/#sec-regexp.prototype.exec

ECMAScript | Условные обозначения

ECMAScript | Свойства объекта-прототипа Регулярных Выражений

Поделись записью