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 protocolthenable 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)))





引入matchAllmatch符号是为了允许class在与各个extends RegExp方法进行交互时String覆盖行为。在实践中,虽然不强制继承关系,仅存在符号键方法就足够了。

09-18 00:20