ECMAScript | RegExp.prototype [ @@split ] ( string, limit )

Примечание 1

Возвращает объект Array, в котором были сохранены подстроки результата преобразования строки string в String. Подстроки определяются путем поиска слева направо совпадений с регулярным выражением значения this; эти вхождения не являются частью какой-либо строки в возвращаемом массиве, но служат для разделения значения String.

Значение this может быть пустым регулярным выражением или регулярным выражением, которое может соответствовать пустой Строке. В этом случае регулярное выражение не соответствует пустой подстроке в начале или конце входной строки, а также не соответствует пустой подстроке в конце предыдущего совпадения разделителя. (Например, если регулярное выражение соответствует пустой строке, строка разбивается на отдельные элементы кодовой единицы; длина результирующего массива равна длине строки, и каждая подстрока содержит одну кодовую единицу.) Только первое совпадение по заданному индексу String рассматривается, даже если обратное отслеживание может привести к непустому совпадению подстроки по этому индексу. (Например, /a*?/[Symbol.split]("ab") оценивается как массив ["a", "b"], в то же время /a*/[Symbol.split]("ab") оценивается как массив ["", "b"].)

Если строка string является пустой строкой (или преобразуется в нее), результат зависит от того, может ли регулярное выражение соответствовать пустой Строке. Если это возможно, результирующий массив не содержит элементов. В противном случае результирующий массив будет содержать один элемент — пустую Строку.

Если регулярное выражение содержит «захватывающие скобки» (capturing parentheses), то каждый раз, когда сопоставляется разделитель separator, результаты (включая любые неопределенные результаты undefined) захватывающих скобок вставляются в выходной массив. Например,

/<(\/)?([^<>]+)>/[Symbol.split]("A<B>bold</B>and<CODE>coded</CODE>")

оценивает массив

["A", undefined, "B", "bold", "/", "B", "and", undefined, "CODE", "coded", "/", "CODE", ""]

Если limit не является undefined, выходной массив усекается так, чтобы он содержал не более элементов limit.


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

1. Пусть rx будет значением этого this.
2. Если тип Type(rx) не является Object, выбросить исключение TypeError.
3. Пусть S будет ? ToString(string).
4. Пусть C будет ? SpeciesConstructor(rx, %RegExp%).
5. Пусть flags будут ? ToString(? Get(rx, "flags")).
6. Если flags содержит "u", пусть unicodeMatching будет истинным true.
7. В противном случае пусть unicodeMatching будет false.
8. Если flags содержит "y", пусть newFlags будет флагами flags.
9. Иначе, пусть newFlags будет конкатенацией строк из флагов flags и "y".
10. Пусть splitter будет ? Построить Construct(C, «rx, newFlags»).
11. Пусть А будет ! ArrayCreate(0).
12. Пусть lengthA равно 0.
13. Если limit является undefined (не определен), пусть lim будет 232 - 1; иначе пусть lim будет (? ToUint32(limit)).
14. Если lim равен 0, вернуть A.
15. Пусть size будет длиной S.
16. Если размер size равен 0, то
  а. Пусть z будет ? RegExpExec(splitter, S).
  b. Если z не является null, верните A.
  c. Выполнить ! CreateDataPropertyOrThrow(A, "0", S).
  d. Вернуть А.
17. Пусть p равно 0.
18. Пусть q равно p.
19. Повторите, пока q < size,
  а. Выполнить ? Установить Set(splitter, "lastIndex", 𝔽(q), true).
  b. Пусть z будет ? RegExpExec(splitter, S).
  c. Если z равно нулю, установите q равным AdvanceStringIndex(S, q, unicodeMatching).
  d. Иначе,
    i. Пусть e будет (? ToLength(? Get(splitter, "lastIndex"))).
    ii. Установите для e значение min(e, size).
    iii. Если e = p, установите q равным AdvanceStringIndex(S, q, unicodeMatching).
    iv. Иначе,
      1. Пусть T - подстрока S от p до q.
      2. Выполните ! CreateDataPropertyOrThrow(A, ! ToString(𝔽(lengthA)), T).
      3. Установите lengthA на lengthA + 1.
      4. Если lengthA = lim, вернуть A.
      5. Установите p на e.
      6. Пусть numberOfCaptures будет ? LengthOfArrayLike(z).
      7. Установите для numberOfCaptures значение max(numberOfCaptures - 1, 0).
      8. Пусть i равно 1.
      9. Повторите, пока inumberOfCaptures,
        а. Пусть nextCapture будет ? Получите Get(z, ! ToString(𝔽(i))).
        b. Выполнить ! CreateDataPropertyOrThrow(A, ! ToString(𝔽(lengthA)), nextCapture).
        c. Установите i в i + 1.
        d. Установите lengthA на lengthA + 1.
        е. Если lengthA = lim, вернуть A.
     10. Установите q на p.
20. Пусть T будет подстрокой S от p до size.
21. Выполнить ! CreateDataPropertyOrThrow(A, ! ToString(𝔽(lengthA)), T).
22. Вернуть А.

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

 

Примечание 2

Метод @@split игнорирует значение «global» и «sticky» свойств этого объекта RegExp.

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

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

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

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

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

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