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%

瀏覽器相容性

另見