Выполняет сопоставление регулярного выражения из строки string с регулярным выражением и возвращает объект массива Array, содержащий результаты сопоставления, или null, если строка string не сопоставима.
Строка ToString(string) ищет вхождения шаблона регулярного выражения следующим образом:
1. Пусть R будет значением этого this. 2. Выполнить ? RequireInternalSlot(R, [[RegExpMatcher]]). 3. Пусть S будет ? ToString(string). 4. Вернуть ? RegExpBuiltinExec(R, S).
- 22.2.5.2.1 RegExpExec ( R, S )
- 22.2.5.2.2 RegExpBuiltinExec ( R, S )
- 22.2.5.2.3 AdvanceStringIndex ( S, index, unicode )
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 и i ≤ n, в порядке возрастания выполните а. Пусть 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 | Свойства объекта-прототипа Регулярных Выражений