Это больше из любопытства, чем что-либо еще, но есть ли чистый метод зацикливания совпадений глобального регулярного выражения и деструктурирования каждого совпадения в одной строке?Самый чистый подход, который я могу придумать:
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
(который в любом случае может быть просто идеальным решением).