JavaScript具有正则表达式类RegExp
。您可以直接创建re = new RegExp(...)
或间接创建re = /.../
多年的编程经验使我习惯了大多数传统方法
const match = re.match(str);
const isMatch = re.text(str);
但是今天我寻找了matchAll函数并使用它的语法是
const matches = re[Symbol.matchAll](str)
这种查找功能的样式如何?为什么不只是
const matches = re.matchAll(str);
我猜有某种原因使用这种特殊格式的几种功能。它背后的原因是什么?
const re = /a(.)b(.)c/g;
const matches = re[Symbol.matchAll]('a1b2c a3b4c a5b6c');
console.log([...matches]);
最佳答案
我寻找了matchAll函数,并使用它的语法是re[Symbol.matchAll](str)
否。正确的语法是使用String matchAll
method,如下所示:
const matches = str.matchAll(re);
使用这种特殊格式的几种功能背后的原因是什么?
他们正在遵循协议。像iterable protocol或thenable protocol一样,它们通常在其他一些方法/语法内部使用,因此不应直接调用。这种协议允许该功能的自定义实现,从而提供了一个覆盖的挂钩。
在
Symbol.matchAll
的情况下,它允许将任意对象用作字符串的匹配器。例如:const integers = {
*[Symbol.matchAll] (str) {
for (const m of str.matchAll(/\d+/g))
yield parseInt(m[0], 10);
}
};
console.log(Array.from("42ab17, 2x".matchAll(integers)))
引入
matchAll
和match
符号是为了允许class
在与各个extends RegExp
方法进行交互时String
覆盖行为。在实践中,虽然不强制继承关系,仅存在符号键方法就足够了。