首页 > 解决方案 > JavaScript 中全局正则表达式匹配的干净数组解构

问题描述

这比其他任何事情都更加出于好奇,但是是否有一种干净的方法可以循环全局正则表达式的匹配并将每个匹配解构在一行中?我能想到的最干净的方法是:

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不可取的范围之外。

理想情况下,会有一种巧妙的方法来避免|| [],但我还没有想到除了添加matches()成员之外的方法RegExp.prototype(无论如何这可能只是理想的解决方案)。

标签: javascriptarraysregexdestructuring

解决方案


为什么不稍后解构一行:

 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;
   //...
 }

推荐阅读