グループと範囲

草案
このページは完成していません。

グループと範囲は、式にある文字のグループと範囲を示します。

種類

文字 意味
x|y

"x" または "y" にマッチします。例えば /green|red/ は "green apple" の "green" や "red apple" の "red" にマッチします。

[xyz]
[a-c]

文字集合です。角括弧で囲まれた文字のいずれか 1 個にマッチします。ハイフンを用いて文字の範囲を指定することも可能ですが、ハイフンが括弧に囲まれた最初または最後の文字に現れている場合、それはハイフンリテラルとみなされて、通常文字として文字集合に含まれます。文字集合には文字クラスを含めることができます。

例えば [abcd][a-d] と同じです。これは "brisket" の "b" や "chop" の "c" にマッチします。

例えば、[abcd-][-abcd] は "brisket" の "b" と "chop" の "c" と "non-profit" の "-" (ハイフン)とマッチします。

例えば、[\w-][A-Za-z0-9_-] と同じです。これは "brisket" の "b" や "chop" の "c" 、"non-profit" の "n" にマッチします。

[^xyz]
[^a-c]

文字集合の否定または補集合です。角括弧で囲まれた文字ではない文字にマッチします。ハイフンを用いて文字の範囲を指定することも可能ですが、ハイフンが括弧に囲まれた最初または最後の文字に現れている場合、それはハイフンリテラルとみなされて、通常文字として文字集合に含まれます。例えば [^abc][^a-c] と同じです。これは "bacon" の 'o' や "chop" の 'h' にマッチします。

^ 文字は入力の先頭を示すこともできます。

(x)

キャプチャグループ: x にマッチし、マッチした内容を記憶します。例えば /(foo)/ は "foo bar" の "foo" にマッチし、記憶します。

正規表現は複数のキャプチャグループを持つことができます。結果、一般的にキャプチャグループ内の左括弧と同じ順にある、配列の要素のキャプチャグループに一致しています。たいていの場合、これはキャプチャグループ自身の順番です。これはキャプチャグループがネストしている場合に重要です。マッチは結果の要素のインデックス ([1], ..., [n]) や、あらかじめ定義されている RegExp オブジェクトのプロパティ ($1, ..., $9) を使ってアクセスできます。

キャプチャグループはパフォーマンスペナルティがあります。マッチした部分文字列を使わない場合はキャプチャしない括弧(後述)を使ったほうがいいでしょう。

全体マッチ (/.../g) がある場合、String.match() はグループを返せません。ですが、 String.matchAll() によってすべてのマッチを取得できます。

\n

n に正の整数が入ります。正規表現内において n 番目の括弧の部分にマッチした最新の部分文字列への後方参照となります(括弧の数は左からカウントします)。例えば /apple(,)\sorange\1/ は "apple, orange, cherry, peach" の "apple, orange," にマッチします。A complete example follows this table.

(?<Name>x)

名前付きキャプチャグループ: x にマッチし、<Name> で指定された名前に従い、返されるマッチの groups プロパティに記憶されます。三角括弧 ('<' と '>') にはグループ名が必須です。

例えば、電話番号からアメリカのエリアコードを取り出す際、/\((?<area>\d\d\d)\)/ を使うことができます。 結果の番号は matches.groups.area に表示されます。

(?:x)

非キャプチャグループ: x にマッチしますが、マッチした内容は記憶しません。マッチの部分文字列は、結果の配列の要素 ([1], ..., [n]) や、あらかじめ定義されている RegExp オブジェクトのプロパティ ($1, ..., $9) から呼び出すことはできません。.

母音を数える

var aliceExcerpt = "There was a long silence after this, and Alice could only hear whispers now and then.";
var regexpVowels = /[aeiouy]/g;

console.log("母音の数:", aliceExcerpt.match(regexpVowels).length);
// 母音の数: 25

グループの使い方

let personList = `First_Name: John, Last_Name: Doe
First_Name: Jane, Last_Name: Smith`;

let regexpNames =  /First_Name: (\w+), Last_Name: (\w+)/mg;
let match = regexpNames.exec(personList);
do {
  console.log(`Hello ${match[1]} ${match[2]}`);
} while((match = regexpNames.exec(personList)) !== null);

名前付きグループの使い方

let personList = `First_Name: John, Last_Name: Doe
First_Name: Jane, Last_Name: Smith`;

let regexpNames =  /First_Name: (?<firstname>\w+), Last_Name: (?<lastname>\w+)/mg;
let match = regexpNames.exec(personList);
do {
  console.log(`Hello ${match.groups.firstname} ${match.groups.lastname}`);
} while((match = regexpNames.exec(personList)) !== null);

注: すべてのブラウザがこの機能をサポートしているわけではありません。以下の互換性の表を参照してください。

仕様

仕様 策定状況 コメント
ECMAScript (ECMA-262)
RegExp: Ranges の定義
現行の標準

ブラウザサポート

No compatibility data found. Please contribute data for "javascript.builtins.RegExp.groups_ranges" (depth: 1) to the MDN compatibility data repository.

関連情報