RegExp.prototype[Symbol.split]()
的[Symbol.split]()
方法RegExp
实例指定如何String.prototype.split
当正则表达式作为分隔符传递时,应如何表现。
试一试
语法
js
regexp[Symbol.split](str)
regexp[Symbol.split](str, limit)
参数
返回值
一个Array
包含子字符串作为其元素。捕获组包含在内。
描述
此方法在String.prototype.split()
当RegExp
作为分隔符传递时。例如,以下两个示例返回相同的结果。
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
参数,同时尝试尽可能接近。因此,如果数组已满,则最后一个匹配及其捕获组可能不会全部出现在返回数组中。
示例
直接调用
此方法的使用方式几乎与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 语言规范 # sec-regexp.prototype-%symbol.split% |
浏览器兼容性
BCD 表格仅在启用 JavaScript 的浏览器中加载。