RegExp.prototype[Symbol.split]()

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2020 年 1 月⁩ 起,所有主流浏览器均已支持。

[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"]

语法

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

参数

str

分割操作的目标。

limit 可选

一个整数,指定要找到的分隔符的数量限制。[Symbol.split]() 方法仍然会对 this 正则表达式模式(或在上面的语法中是 regexp)的每一次匹配进行分割,直到分割出的项目数量达到 limit,或者字符串无法再匹配 this 模式。

返回值

一个包含子字符串作为元素的 Array。包含捕获组。

描述

RegExp 作为分隔符传递给 String.prototype.split() 时,该方法会被内部调用。例如,以下两个示例返回相同的结果。

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

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

此方法用于定制 RegExp 子类中 split() 的行为。

RegExp.prototype[Symbol.split]() 基类方法表现出以下行为:

  • 它首先使用 [Symbol.species] 来构造一个新的正则表达式,从而避免以任何方式修改原始正则表达式。
  • 正则表达式的 g(“全局”)标志将被忽略,并且 y(“粘性”)标志将始终应用,即使它最初不存在。
  • 如果目标字符串为空,并且正则表达式可以匹配空字符串(例如 /a?/),则返回一个空数组。否则,如果正则表达式无法匹配空字符串,则返回 [""]
  • 匹配通过持续调用 this.exec() 进行。由于正则表达式始终是粘性的,这将沿着字符串移动,每次都会产生一个匹配的字符串、索引以及任何捕获组。
  • 对于每个匹配项,首先将最后一个匹配字符串的结束位置和当前匹配字符串的开始位置之间的子字符串添加到结果数组中。然后,逐个添加捕获组的值。
  • 如果当前匹配项是空字符串,或者正则表达式在当前位置不匹配(因为它很粘性),lastIndex 仍会被推进——如果正则表达式是 Unicode 感知的,它会前进一个 Unicode 代码点;否则,它会前进一个 UTF-16 代码单元。
  • 如果正则表达式不匹配目标字符串,则目标字符串将被原样返回,并包装在一个数组中。
  • 如果提供了 limit 参数,返回数组的长度将永远不会超过 limit,同时会尽量接近它。因此,如果数组已满,最后一个匹配项及其捕获组可能不会全部出现在返回的数组中。

示例

直接调用

此方法的使用方式几乎与 String.prototype.split() 相同,只是 this 不同,并且参数的顺序也不同。

js
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]() 方法来修改默认行为。

js
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® 2026 语言规范
# sec-regexp.prototype-%symbol.split%

浏览器兼容性

另见