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]()по-прежнему разделяет строку по каждому совпадению с шаблономthisRegExp (или, в приведённом выше синтаксисе,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)"]
Спецификации
Совместимость с браузерами
| Десктопные | Мобильные | Серверные | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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