这更多的是出于好奇,但是有没有一种干净的方法来循环全局正则表达式的匹配并在一行中解构每个匹配? 我能想到的最干净的方法是:
let regex = /(a)(b)?(c*)/g,
str = 'cabcccaccaaabbacb',
match, a, otherCaptures;
while (([match, a, ...otherCaptures] = regex.exec(str) || []).length) {
// do stuff
console.log(match, a, otherCaptures);
}
如果不包含|| []
,它会尝试解构null
从而引发错误。 空数组是真实的,所以我能想到的最好的方法是检查它的长度。 由于不能将let
语句括在括号中,然后调用其成员,因此变量声明需要在while
范围之外进行,这是不希望的。
理想情况下,会有一种聪明的方法来避免|| []
,但我还没有想到一个,除了向RegExp.prototype
添加一个matches()
成员(无论如何这可能只是理想的解决方案(。
为什么不稍后解构一行:
let part;
while(part = regex.exec(str)) {
const [match, a, ...otherCaptures] = part;
//...
}
使用 for 循环,part
也可以是本地范围的:
for(let part; part = regex.exec(str); ) {
const [match, a, ...otherCaptures] = part;
//...
}