RegExp.prototype[Symbol.split]()
RegExp
实例的 [Symbol.split]()
方法指定当正则表达式作为分隔符传入时 String.prototype.split
的行为方式。
¥The [Symbol.split]()
method of RegExp
instances specifies how String.prototype.split
should behave when the regular expression is passed in as the separator.
Try it
语法
参数
返回值
描述
¥Description
当 RegExp
作为分隔符传递时,会在 String.prototype.split()
内部调用此方法。例如,以下两个示例返回相同的结果。
¥This method is called internally in String.prototype.split()
when a RegExp
is passed as the separator. For example, the following two examples return the same result.
"a-b-c".split(/-/);
/-/[Symbol.split]("a-b-c");
该方法用于自定义 RegExp
子类中 split()
的行为。
¥This method exists for customizing the behavior of split()
in RegExp
subclasses.
RegExp.prototype[Symbol.split]()
基本方法表现出以下行为:
¥The RegExp.prototype[Symbol.split]()
base method exhibits the following behaviors:
- 它首先使用
[Symbol.species]
构造一个新的正则表达式,从而避免以任何方式改变原始正则表达式。 - 正则表达式的
g
("global") 标志将被忽略,并且始终应用y
("sticky") 标志,即使它最初不存在也是如此。 - 如果目标字符串为空,并且正则表达式可以匹配空字符串(例如,
/a?/
),则返回空数组。否则,如果正则表达式无法匹配空字符串,则返回[""]
。 - 通过连续调用
this.exec()
进行匹配。由于正则表达式始终是粘性的,因此它将沿着字符串移动,每次都会生成匹配的字符串、索引和任何捕获组。 - 对于每个匹配,最后一个匹配字符串的末尾和当前匹配字符串的开头之间的子字符串首先附加到结果数组中。然后,捕获组的值被一一附加。
- 如果当前匹配是空字符串,或者正则表达式在当前位置不匹配(因为它是粘性的),则
lastIndex
仍将前进 - 如果正则表达式是 Unicode 感知,它将前进一个 Unicode 代码点;否则,前进一个 UTF-16 代码单元。 - 如果正则表达式与目标字符串不匹配,则目标字符串按原样返回,并封装在数组中。
- 返回的数组的长度永远不会超过
limit
参数(如果提供),同时尝试尽可能接近。因此,如果数组已填满,则最后一个匹配项及其捕获组可能不会全部出现在返回的数组中。
示例
直接致电
¥Direct call
该方法的使用方式与 String.prototype.split()
几乎相同,除了 this
不同以及参数顺序不同之外。
¥This method can be used in almost the same way as
String.prototype.split()
, except the different this
and the
different order of arguments.
const re = /-/g;
const str = "2016-01-02";
const result = re[Symbol.split](str);
console.log(result); // ["2016", "01", "02"]
在子类中使用 [Symbol.split]()
¥Using [Symbol.split]()
in subclasses
RegExp
的子类可以重写 [Symbol.split]()
方法来修改默认行为。
¥Subclasses of RegExp
can override the [Symbol.split]()
method to
modify the default behavior.
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)"]
规范
Specification |
---|
ECMAScript Language Specification # sec-regexp.prototype-@@split |
浏览器兼容性
BCD tables only load in the browser