while не совсем удобен
Можно
while заменить на
for, переместить вызов
exec в условие продолжения цикла - получится одна строка вместо трёх, область видимости вне цикла не загажена не нужной там переменной, вроде бы неплохо:
for (let m; m = re.exec(str);) {
console.log(m.groups);
}
Отказаться от
exec стоит по другой причине. Проблема в том, что если забыть флаг
g при определении регулярного выражения, то
exec будет при каждом вызове выдавать первое совпадение, т.е., цикл получится бесконечным. А вот с
matchAll такой ерунды не случится, без флага выдаст ошибку:
for (const { groups } of str.matchAll(re)) {
console.log(groups);
}