javascript - 为什么 JavaScript 中 RegExp 的 matchAll 与其他方法如此不同?
问题描述
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)
不,正确的语法是使用StringmatchAll
方法,如下所示:
const matches = str.matchAll(re);
使用这种特殊格式的几个函数背后的原因是什么?
他们遵循一个协议。像iterable 协议或thenable 协议一样,它们通常在内部用于一些其他方法/语法,不应该直接调用。这样的协议允许自定义特性的实现,提供一个覆盖的钩子。
在 的情况下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
推荐阅读
- r - 问题:根据 data.table 中其他元素的数量随机选择行?
- python - 编写一个函数,返回数据集中列中唯一名称的数量 - Python
- mysql - MYSQLDUMP:@符号后更改内容
- python - 我正在尝试使用 CNN 进行股票价格预测,但我的代码似乎不起作用,我需要更改或添加什么?
- javascript - Moment 和 ChartJS 时间格式解析的问题
- python - 想要从网站下载图片而不是 json 文件
- entity-framework - 如何在WEB API中将多个模型作为参数传递
- javascript - Date.setHours 在模拟时钟上不存在,几秒钟后返回渲染当前时间
- javascript - 我有错误:传入的参数必须是 12 个字节的单个字符串或 24 个十六进制字符的字符串,如何解决?我确实需要一个示例代码
- apache-kafka - 如何为 sasl 普通 kafka 集群运行模式注册表容器