一尘不染

JavaScript正则表达式和子匹配项

javascript

g设置修饰符后,为什么Java子匹配项停止工作?

var text = 'test test test test';

var result = text.match(/t(e)(s)t/);
// Result: ["test", "e", "s"]

上面的方法很好,result[1]is "e"result[2]is "s"

var result = text.match(/t(e)(s)t/g);
// Result: ["test", "test", "test", "test"]

上面的内容忽略了我的捕获组。以下是唯一有效的解决方案吗?

var result = text.match(/test/g);
for (var i in result) {
    console.log(result[i].match(/t(e)(s)t/));
}
/* Result:
["test", "e", "s"]
["test", "e", "s"]
["test", "e", "s"]
["test", "e", "s"]
*/

编辑:

我再次高兴地告诉您,十年后您现在可以执行此操作(.matchAll已添加到规范中)

let result = [...text.matchAll(/t(e)(s)t/g)];

阅读 455

收藏
2020-05-01

共1个答案

一尘不染

我很惊讶地发现我是第一个回答我十年前一直在寻找答案的人(答案尚不存在)。我还希望实际的规范作者会在我之前回答它;)。

.matchAll 已被添加到一些浏览器中。

在现代javascript中,我们现在只需执行以下操作即可完成此操作。

let result = [...text.matchAll(/t(e)(s)t/g)];

一个例子是

saw(text).matchAll(/t(e)(s)t/g)

它将输出更加用户友好的匹配数组,如果您想花哨的话,可以将其放入命名的捕获组并获取对象数组。

2020-05-01