# Get all regex matches with capturing groups in JavaScript

> Learn how to get every match of a regex in JavaScript with matchAll() and the g flag, and read named capturing groups from each result using match.groups.

Author: Flavio Copes | Published: 2023-01-14 | Canonical: https://flaviocopes.com/how-to-get-retrieve-all-results-of-a-regex-with-capturing-groups-in-js/

I had this job to do

Basically I had a string that contained multiple URLs and I wanted to process them all using a regular expression.

This regular expression used [capturing groups](https://flaviocopes.com/javascript-regular-expressions/#capturing-groups), which are great.

> Tip: you can test regexes with capturing groups in my [regex tester](https://flaviocopes.com/tools/regex-tester/), it lists every group of every match.

So, let’s start from getting one single result:

```javascript
const text = 'hello1 bla bla hello2'

const regex = /hello\d/

text.match(regex)

/*
[ 'hello1', index: 0, input: 'hello1 bla bla hello2', groups: undefined ]
*/
```

Getting multiple results from a regex can be done using the `g` flag and it’s automatic, but now the result of `match()` is different, just the matched result:

```javascript
const text = 'hello1 bla bla hello2'

const regex = /hello\d/g

console.log(text.match(regex))
//[ 'hello1', 'hello2' ]
```

Using `matchAll()` (an ES2020 feature) you can get a more detailed result set. 

That returns an iterator object, so you need to use a loop to go through the results:

```javascript
for (let match of text.matchAll(regex)) {
  console.log(match)
}

/*
[ 'hello1', index: 0, input: 'hello1 bla bla hello2', groups: undefined ]
[ 'hello2', index: 15, input: 'hello1 bla bla hello2', groups: undefined ]
*/
```

Let’s talk about capturing groups.

Say you have a text containing dates like this:

```javascript
const text = '2015-01-02 2022-02-04 2040-12-02'
```

and you have a regex to match that date pattern, because maybe you want to get the years references:

```javascript
const regex = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/g
```

This uses [named capturing groups](https://flaviocopes.com/javascript-regular-expressions/#named-capturing-groups).

Using `text.match(regex)` now will not give you any information about the groups:

```javascript
const text = '2015-01-02 2022-02-04 2040-12-02'

const regex = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/g

text.match(regex)

/*
[ '2015-01-02', '2022-02-04', '2040-12-02' ]
*/
```

but you can get this information using `text.matchAll(regex)`:

```javascript
const text = '2015-01-02 2022-02-04 2040-12-02'

const regex = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/g
for (let match of text.matchAll(regex)) {
  console.log(match)
}

/*
[ '2015-01-02', '2015', '01', '02', index: 0, input: '2015-01-02 2022-02-04 2040-12-02', groups: [Object: null prototype] { year: '2015', month: '01', day: '02' } ]
[ '2022-02-04', '2022', '02', '04', index: 11, input: '2015-01-02 2022-02-04 2040-12-02', groups: [Object: null prototype] { year: '2022', month: '02', day: '04' } ]
[ '2040-12-02', '2040', '12', '02', index: 22, input: '2015-01-02 2022-02-04 2040-12-02', groups: [Object: null prototype] { year: '2040', month: '12', day: '02' } ]
*/
```

So you could extract the year information like this:

```javascript
const text = '2015-01-02 2022-02-04 2040-12-02'

const regex = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/g

for (let match of text.matchAll(regex)) {
  console.log(match.groups.year)
}

/*
'2015'
'2022'
'2040'
*/
```
