Чистая деструктуризация массива глобальных совпадений регулярных выражений в JavaScript - PullRequest
0 голосов
/ 15 октября 2018

Это больше из любопытства, чем что-либо еще, но есть ли чистый метод зацикливания совпадений глобального регулярного выражения и деструктурирования каждого совпадения в одной строке?Самый чистый подход, который я могу придумать:

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 (который в любом случае может быть просто идеальным решением).

1 Ответ

0 голосов
/ 15 октября 2018

Почему бы просто не деструктурировать одну строку позже:

 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;
   //...
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...