Как получить данные из групп в регулярном выражении?

let result = str.match(/()\s()\s()\s()\s()\s()\s()/g);

Например мы получаем с помощью подобного регулярного выражения совпадения по строкам с наличием семи значений в ней. У нас получается некий список. Вопрос, как взять из регулярного выражения определенную группу или их все? То есть скажем, что например требуется третье значение (группа) в полученной строке. Для понимания хватит примера с выводом в консоль.


Ответы (1 шт):

Автор решения: Qwertiy

При использовании флага g в match в массив вместо вместо групп попадают все совпадения:

console.log("abcade".match(/a(.)(.)/))
console.log("abcade".match(/a(.)(.)/g))

Сейчас в js добавлен метод matchAll, который возвращает итератор (не массив!) массивов с группами:

for (var match of "abcade".matchAll(/a(.)(.)/g)) {
  console.log(match)
}

Для более старых браузеров можно было использовать replace как forEach:

"abcade".replace(/a(.)(.)/g, (m, a, b) => {
  console.log(m, a, b)
})

Кстати, с именованными группами тоже работает:

for (var match of "abcade".matchAll(/a.(?<third>.)/g)) {
  console.log("matchAll", match.groups.third)
}

"abcade".replace(/a.(?<third>.)/g, (m, g1, i, s, gs) => {
  console.log("replace", gs.third)
})

"abcade".replace(/a.(?<third>.)/g, (...args) => {
  var gs = args.pop()
  console.log("replace (2)", gs.third)
})

→ Ссылка