JavaScriptの正規表現でグループ化・キャプチャを活用する方法
生徒
「JavaScriptの正規表現で複数の文字列をまとめて処理することはできますか?」
先生
「できます。グループ化を使うと、特定の部分をまとめて扱ったり、後で取り出すことができます。」
生徒
「グループ化って具体的にはどう書くんですか?」
先生
「丸括弧 ( ) を使ってグループ化します。そしてキャプチャした内容は後で参照することができます。」
1. グループ化とは?
正規表現で丸括弧 ( ) を使うと、その部分を1つの単位として扱えます。これをグループ化と言います。グループ化すると、マッチした内容を後から取り出したり、置換に利用できます。
const text = "2025-12-11";
const regex = /(\d{4})-(\d{2})-(\d{2})/;
const result = text.match(regex);
console.log(result);
/*
[
"2025-12-11", // 全体のマッチ
"2025", // 1つ目のグループ(年)
"12", // 2つ目のグループ(月)
"11" // 3つ目のグループ(日)
]
この例では、日付の年・月・日をそれぞれ別のグループとしてキャプチャしています。
2. キャプチャした内容の利用
キャプチャした内容は match メソッドで配列として取り出せます。また、置換にも便利です。
const date = "2025-12-11";
const newDate = date.replace(/(\d{4})-(\d{2})-(\d{2})/, "$3/$2/$1");
console.log(newDate); // "11/12/2025"
$1、$2、$3 はそれぞれ1つ目、2つ目、3つ目のグループの内容に置き換わります。
3. グループ化の応用例
メールアドレスからユーザー名とドメインを取り出す場合もグループ化が役立ちます。
const email = "user@example.com";
const regex = /(.+)@(.+)/;
const match = email.match(regex);
console.log(match[1]); // "user"
console.log(match[2]); // "example.com"
このように丸括弧で囲むだけで、複数の部分を簡単にキャプチャできます。
4. グループ化のポイント
- 丸括弧
( )で囲むとグループ化できる - キャプチャした内容は
match配列や置換で利用可能 - 複雑な文字列の抽出や置換処理に便利
- グループに名前をつけたい場合は
(?のように名前付きキャプチャも使える…)
初心者の方はまず簡単な文字列で丸括弧を使ったキャプチャを試すことで、正規表現の強力さを実感できます。
5. 名前付きキャプチャの使い方
JavaScriptの正規表現では、名前付きキャプチャを使うことで、グループに分かりやすい名前を付けることができます。これにより、配列の番号ではなく名前で値を取得できるため、コードの可読性が向上します。
const text = "2025-12-11";
const regex = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
const result = text.match(regex);
console.log(result.groups.year); // "2025"
console.log(result.groups.month); // "12"
console.log(result.groups.day); // "11"
このように、意味のある名前を付けることで、どの値がどの部分かが一目で分かるようになります。
6. 非キャプチャグループの使い方
グループ化はしたいがキャプチャは不要な場合、非キャプチャグループ (?: ) を使います。これにより、マッチングのグループとして扱いつつ、結果に含めないようにできます。
const text = "cat bat mat";
const regex = /(?:c|b|m)at/g;
const result = text.match(regex);
console.log(result); // ["cat", "bat", "mat"]
通常のグループと違い、番号での参照対象にならないため、不要なキャプチャを減らして処理をシンプルにできます。
7. グループ化と繰り返しの組み合わせ
グループ化は繰り返し指定と組み合わせることで、より柔軟なパターンを作ることができます。例えば同じパターンが複数回続く文字列を検出する場合に便利です。
const text = "abcabcabc";
const regex = /(abc)+/;
const result = text.match(regex);
console.log(result[0]); // "abcabcabc"
console.log(result[1]); // "abc"
このように、グループ化と繰り返しを組み合わせることで、複雑な文字列パターンも効率よく扱うことができます。初心者の方はまず簡単な繰り返しから試してみると理解が深まります。