Информация о работе абстрактной операции GetSubstitution() актуальна на дату публикации (26 января 2022 года)
Абстрактная операция GetSubstitution (Получить замену) принимает аргументы matched (Строка), str (Строка), position (неотрицательное целое), captures (возможно, пустой Список, каждый из элементов которого является Строкой или undefined), namedCaptures (Объект или undefined) и replaceTemplate (Строка). Для целей этой абстрактной операции десятичная цифра представляет собой кодовую единицу в диапазоне от 0x0030 (ЦИФРА НОЛЬ) до 0x0039 (ЦИФРА ДЕВЯТЬ) включительно. При вызове она выполняет следующие действия:
1. Пусть stringLength будет количеством кодовых единиц (code units) в строке str. 2. Утверждено: position ≤ stringLength. 3. Пусть templateRemainder будет replaceTemplate. 4. Пусть result будет пустая Строка. 5. Повторите, пока templateRemainder не является пустой Строкой, а. ПРИМЕЧАНИЕ. Следующие шаги изолируют ref (префикс templateRemainder), определяют refReplacement (его замену), а затем добавляют эту замену к результату result. b. Если templateRemainder начинается с "$$", то i. Пусть ref будет "$$". ii. Пусть refReplacement будет "$". c. В противном случае, если templateRemainder начинается с "$`", то i. Пусть ref будет "$`". ii. Пусть refReplacement будет подстрокой str от 0 до position. d. В противном случае, если templateRemainder начинается с "$&", то i. Пусть ref будет "$&". ii. Пусть refReplacement будет matched. e. В противном случае, если templateRemainder начинается с "$'" (0x0024 (ЗНАК ДОЛЛАРА), за которым следует 0x0027 (АПОСТРОФ)), то i. Пусть ref будет "$'". ii. Пусть matchLength будет количеством кодовых единиц в matched. iii. Пусть tailPos будет position + matchLength. iv. Пусть refReplacement будет подстрокой str из min(tailPos, stringLength). v. ПРИМЕЧАНИЕ: tailPos может превышать stringLength только в том случае, если эта абстрактная операция была вызвана вызовом встроенного метода @@replace из %RegExp.prototype% для объекта, чьё свойство "exec" не является встроенным %RegExp.prototype.exec% . f. В противном случае, если templateRemainder начинается с "$", за которым следует 1 или более десятичных цифр, то i. Пусть found (найдено) является false. ii. Для каждого целого числа d из « 2, 1 » выполните 1. Если found является false и templateRemainder начинается с "$", за которым следует d или более десятичных цифр, то a. Установите found в значение true. b. Пусть ref будет подстрокой templateRemainder от 0 до 1 + d. c. Пусть цифры digits будут подстрокой templateRemainder от 1 до 1 + d. d. Пусть индекс index будет ℝ (StringToNumber(digits)). e. Утверждено: 0 ≤ index ≤ 99. f. Если index = 0, то i. Пусть refReplacement будет ref. g. В противном случае, если index ≤ количества элементов в захватах captures, то i. Пусть захват capture будет captures[index - 1]. ii. Если захват capture является undefined (не определен), то i. Пусть refReplacement будет пустой Строкой. iii. Иначе, i. Пусть refReplacement будет захватом capture. h. Иначе, i. Пусть refReplacement будет ref. g. В противном случае, если templateRemainder начинается с "$<", то i. Пусть gtPos будет StringIndexOf(templateRemainder, ">", 0). ii. Если gtPos = -1 или namedCaptures является undefined (не определено), то 1. Пусть ref будет "$<". 2. Пусть refReplacement будет ref. iii. Иначе, 1. Пусть ref будет подстрокой templateRemainder от 0 до gtPos + 1. 2. Пусть groupName будет подстрокой templateRemainder от 2 до gtPos. 3. Утверждено: Тип(namedCaptures) — это Объект. 4. Пусть захват capture будет ? Получить(namedCaptures, groupName). 5. Если захват capture является undefined (не определено), то а. Пусть refReplacement будет пустой Строкой. 6. Иначе, а. Пусть refReplacement будет ? ToString(capture). h. Иначе, i. Пусть ref будет подстрокой templateRemainder от 0 до 1. ii. Пусть refReplacement будет ref. i. Пусть refLength будет количеством кодовых единиц в ref. j. Задайте для templateRemainder подстроку templateRemainder из refLength. k. Установите result в качестве результата конкатенацию строк result и refReplacement. 6. Вернуть result.
Информационные ссылки
Стандарт ECMAScript — Раздел «22.1.3.18.1 GetSubstitution ( matched, str, position, captures, namedCaptures, replacementTemplate )» — https://tc39.es/ecma262/#sec-getsubstitution