Groups and backreferences
Groups group multiple patterns as a whole, and capturing groups provide extra submatch information when using a regular expression pattern to match against a string. Backreferences refer to a previously captured group in the same regular expression.
Try it
Types
Characters | Meaning |
---|---|
(x) |
Capturing group: Matches
A regular expression may have multiple capturing groups. In results,
matches to capturing groups typically in an array whose members are in
the same order as the left parentheses in the capturing group. This is
usually just the order of the capturing groups themselves. This
becomes important when capturing groups are nested. Matches are
accessed using the index of the result's elements ( Capturing groups have a performance penalty. If you don't need the matched substring to be recalled, prefer non-capturing parentheses (see below).
|
(?<Name>x) |
Named capturing group: Matches "x" and stores it on
the groups property of the returned matches under the name specified
by
For example, to extract the United States area code from a phone
number, we could use |
(?:x) |
Non-capturing group: Matches "x" but does not remember
the match. The matched substring cannot be recalled from the resulting
array's elements ([1], …, [n] ) or from the predefined
RegExp object's properties ($1, …, $9 ).
|
\n |
Where "n" is a positive integer. A back reference to the last
substring matching the n parenthetical in the regular expression
(counting left parentheses). For example,
|
\k<Name> |
A back reference to the last substring matching the
Named capture group specified by
For example,
Note: |
Examples
Using groups
js
const personList = `First_Name: John, Last_Name: Doe
First_Name: Jane, Last_Name: Smith`;
const regexpNames = /First_Name: (\w+), Last_Name: (\w+)/gm;
for (const match of personList.matchAll(regexpNames)) {
console.log(`Hello ${match[1]} ${match[2]}`);
}
Using named groups
js
const personList = `First_Name: John, Last_Name: Doe
First_Name: Jane, Last_Name: Smith`;
const regexpNames =
/First_Name: (?<firstname>\w+), Last_Name: (?<lastname>\w+)/gm;
for (const match of personList.matchAll(regexpNames)) {
console.log(`Hello ${match.groups.firstname} ${match.groups.lastname}`);
}
Using groups and back references
js
const quote = `Single quote "'" and double quote '"'`;
const regexpQuotes = /(['"]).*?\1/g;
for (const match of quote.matchAll(regexpQuotes)) {
console.log(match[0]);
}
Using groups and match indices
By providing the d
flag, the indices of each capturing group is returned. This is especially useful if you are correlating each matched group with the original text — for example, to provide compiler diagnostics.
js
const code = `function add(x, y) {
return x + y;
}`;
const functionRegexp =
/(function\s+)(?<name>[$_\p{ID_Start}][$\u200c\u200d\p{ID_Continue}]*)/du;
const match = functionRegexp.exec(code);
const lines = code.split("\n");
lines.splice(
1,
0,
" ".repeat(match.indices[1][1] - match.indices[1][0]) +
"^".repeat(match.indices.groups.name[1] - match.indices.groups.name[0]),
);
console.log(lines.join("\n"));
// function add(x, y) {
// ^^^
// return x + y;
// }