Spec-Zone.ru › JavaScript

RegExp.prototype[Symbol.split]()

Базовая версия Широко доступно

Эта возможность хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с июля 2015 года.

Метод [Symbol.split]() экземпляров RegExp определяет, как должна вести себя функция String.prototype.split, когда регулярное выражение передаётся в качестве разделителя.

Попробовать

class RegExp1 extends RegExp {
  [Symbol.split](str, limit) {
    const result = RegExp.prototype[Symbol.split].call(this, str, limit);
    return result.map((x) => `(${x})`);
  }
}

console.log("2016-01-02".split(new RegExp1("-")));
// Expected output: Array ["(2016)", "(01)", "(02)"]

console.log("2016-01-02".split(/-/));
// Expected output: Array ["2016", "01", "02"]

Синтаксис

regexp[Symbol.split](str)
regexp[Symbol.split](str, limit)

Параметры

str
Целевая строка для операции разделения.
limit Необязательный
Целое число, задающее ограничение на количество найденных разделений. Метод [Symbol.split]() по-прежнему разделяет строку по каждому совпадению с шаблоном this RegExp (или, в приведённом выше синтаксисе, regexp), пока количество элементов разделения не достигнет limit, либо пока строка не закончится до достижения шаблона this.

Возвращаемое значение

Массив Array, содержащий подстроки в качестве своих элементов. Захватывающие группы включаются.

Описание

Этот метод существует для настройки поведения split() в подклассах RegExp. Он вызывается внутренне в String.prototype.split(), когда в качестве разделителя передаётся RegExp. Например, следующие два примера возвращают один и тот же результат.

"a-b-c".split(/-/);

/-/[Symbol.split]("a-b-c");

Подобно [Symbol.matchAll](), [Symbol.split]() начинает с использования [Symbol.species] для конструирования нового регулярного выражения, тем самым избегая изменения исходного регулярного выражения. Конструктор принимает this и исходные флаги, а также флаг y ("sticky", липкий), если он изначально отсутствовал. Флаг g ("global", глобальный) не имеет отношения к поведению метода. По умолчанию, из-за поведения конструктора RegExp(), lastIndex начинается с 0.

Если целевая строка пуста, и регулярное выражение может соответствовать пустым строкам (например, /a?/), возвращается пустой массив. В противном случае, если регулярное выражение не может соответствовать пустой строке, возвращается [""].

Метод exec() регулярного выражения вызывается повторно, каждый раз продвигая lastIndex, пока не будет достигнут конец строки. Если текущее совпадение является пустой строкой, или если регулярное выражение не совпадает в текущей позиции (так как оно является "липким"), lastIndex всё равно будет продвигаться — если регулярное выражение является осведомлённым о Unicode, оно продвинется на одну кодовую точку Unicode; в противном случае оно продвигается на одну единицу кода UTF-16.

console.log("😄".split(/(?:)/g)); // [ '\ud83d', '\ude04' ]
console.log("😄".split(/(?:)/gu)); // [ '😄' ]

Для каждого совпадения подстрока между концом последней совпавшей строки и началом текущей совпавшей строки сначала добавляется в результирующий массив. Затем значения захватывающих групп добавляются одно за другим. Длина возвращаемого массива никогда не превысит параметр limit, если он предоставлен, при этом старается быть максимально близкой к нему. Следовательно, последнее совпадение и его захватывающие группы могут присутствовать в возвращаемом массиве не полностью, если массив уже заполнен.

Если в строке не было найдено ни одного успешного совпадения, целевая строка возвращается как есть, обернутая в массив.

Примеры

Прямой вызов

Этот метод можно использовать почти так же, как и String.prototype.split(), за исключением другого this и другого порядка аргументов.

const re = /-/g;
const str = "2016-01-02";
const result = re[Symbol.split](str);
console.log(result); // ["2016", "01", "02"]

Использование [Symbol.split]() в подклассах

Подклассы RegExp могут переопределить метод [Symbol.split]() для изменения поведения по умолчанию.

class MyRegExp extends RegExp {
  [Symbol.split](str, limit) {
    const result = RegExp.prototype[Symbol.split].call(this, str, limit);
    return result.map((x) => `(${x})`);
  }
}

const re = new MyRegExp("-");
const str = "2016-01-02";
const result = str.split(re); // String.prototype.split calls re[Symbol.split]().
console.log(result); // ["(2016)", "(01)", "(02)"]

Спецификации

Спецификация
ECMAScript® 2027 Language Specification
# sec-regexp.prototype-%symbol.split%

Совместимость с браузерами

Десктопные Мобильные Серверные
Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet WebView Android WebView on iOS Bun Deno Node.js
@@split
50
79
49
37
10
50
49
37
10
5.0
50
10
1.0.0
1.0
6.0.0

Смотрите также

  • Полифил RegExp.prototype[Symbol.split] в core-js
  • String.prototype.split()
  • RegExp.prototype[Symbol.match]()
  • RegExp.prototype[Symbol.matchAll]()
  • RegExp.prototype[Symbol.replace]()
  • RegExp.prototype[Symbol.search]()
  • RegExp.prototype.exec()
  • RegExp.prototype.test()
  • Symbol.split

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/Symbol.split

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API