ECMAScript | RegExp.prototype [ @@replace ] ( string, replaceValue )

Когда метод @@replace вызывается с аргументами string и replaceValue, выполняются следующие шаги:

1. Пусть rx будет значением this.
2. Если Type(rx) не является Object, выбросить исключение TypeError.
3. Пусть S будет ? ToString(string).
4. Пусть lengthS будет количеством элементов кодовой единицы в S.
5. Пусть functionReplace будет IsCallable(replaceValue).
6. Если functionReplace имеет значение false, тогда
   а. Установите replaceValue на ? ToString(replaceValue).
7. Пусть global будет ! ToBoolean(? Get(rx, "global")).
8. Если global является true (истинно), то
   а. Пусть fullUnicode будет ! ToBoolean(? Get(rx, "unicode")).
   b. Выполнить ? Установить Set(rx, "lastIndex", +0𝔽, true).
9. Пусть результаты results будут новым пустым Списком.
10. Пусть сделано done будет false.
11. Повторить, пока done является false,
   а. Пусть результат result будет ? RegExpExec(rx, S).
   b. Если результат равен null, установите для параметра done значение true.
   c. Иначе,
      i. Добавьте результат result в конец результатов results.
      ii. Если global имеет значение false, установите для параметра done значение true.
      iii. Иначе,
         1. Пусть matchStr будет ? ToString(? Get(result, "0")).
         2. Если matchStr - это пустая Строка, тогда
            а. Пусть thisIndex будет (? ToLength(? Get(rx, "lastIndex"))).
            b. Пусть nextIndex будет AdvanceStringIndex(S, thisIndex, fullUnicode).
            c. Выполнить ? Установить Set(rx, "lastIndex", 𝔽(nextIndex), true).
12. Пусть accumulatedResult будет пустой Строкой.
13. Пусть nextSourcePosition равно 0.
14. Для каждого элемента result из results выполните
   а. Пусть resultLength будет ? LengthOfArrayLike(result).
   b. Пусть nCapture будет max(resultLength - 1, 0).
   c. Пусть matched будет ? ToString(? Get(result, "0")).
   d. Пусть matchLength будет числом кодовых единиц matched.
   е. Пусть position будет ? ToIntegerOrInfinity(? Get(result, "index")).
   f. Установите позицию position на результат зажима position от 0 до lengthS.
   g. Пусть n равно 1.
   h. Пусть captures будет новым пустым Списком.
   i. Повторите, пока nnCapture,
      i. Пусть capN будет ? Получить Get(result, ! ToString(𝔽(n))).
      ii. Если capN не является undefined, тогда
         1. Установите capN на ? ToString(capN).
      iii. Добавьте capN как последний элемент захвата captures.
      iv. Установите n равным n + 1.
   j. Пусть namedCaptures будет ? Получить Get(result, "groups").
   k. Если functionReplace является true, то
      i. Пусть replacerArgs будет «matched».
      ii. Добавить в порядке Списка элементы захватов captures в конец Списка replacerArgs.
      iii. Добавьте 𝔽(position) и S к replacerArgs.
      iv. Если namedCaptures не является undefined, тогда
         1. Добавьте namedCaptures в качестве последнего элемента replacerArgs.
      v. Пусть replValue будет ? Вызов Call(replaceValue, undefined, replacerArgs).
      vi. Пусть replacement будет ? ToString(replValue).
   l. Иначе,
      i. Если namedCaptures не является undefined, тогда
         1. Установите для namedCaptures значение ? ToObject(namedCaptures).
      ii. Пусть replacement будет ? GetSubstitution(matched, S, position, captures, namedCaptures, replaceValue).
   m. Если positionnextSourcePosition, то
      i. ПРИМЕЧАНИЕ: положение position обычно не должно сдвигаться назад. Если это так, это указывает на некорректное поведение подкласса RegExp или использование побочного эффекта, инициируемого доступом, для изменения глобального флага или других характеристик rx. В таких случаях соответствующая подстановка игнорируется.
      ii. Задайте для accumulatedResult конкатенацию строк для accumulatedResult, подстроку S из nextSourcePosition в положение position и замену replacement.
      iii. Установите для nextSourcePosition значение position + matchLength.
15. Если nextSourcePositionlengthS, вернуть accumulatedResult.
16. Верните конкатенацию строки аккумуляторного результата accumulatedResult и подстроки S из nextSourcePosition.

Значение свойства «name» этой функции — «[Symbol.replace]«.

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

Предыдущий раздел — ECMAScript | get RegExp.prototype.multiline

Стандарт ECMAScript — Раздел «RegExp (Regular Expression) Objects» — https://tc39.es/ecma262/#sec-regexp-regular-expression-objects

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

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

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