JS 正規表現:アサーションとグループ
1. RegExpアサーション (RegExp Assertions)
アサーション(Assertions)は、境界(Boundaries)やルックアラウンド(Lookarounds)にマッチします。これには、文字列境界、単語境界、そして先行判定(Lookaheads)や後行判定(Lookbehinds)が含まれます。
// 文字列の先頭にマッチさせる
const pattern1 = /^Volardev/;
// 文字列の末尾にマッチさせる
const pattern2 = /Volardev$/;1.1 JavaScript アサーション構文一覧
(2025年7月改訂版)
| 構文 | 名称 | 説明 |
|---|---|---|
| ^ | 文字列境界 | 文字列の先頭にマッチします。 |
| $ | 文字列境界 | 文字列の末尾にマッチします。 |
| \b | 単語境界 | 単語の先頭または末尾にマッチします。 |
| \B | 非単語境界 | 単語の先頭または末尾以外の箇所にマッチします。 |
| (?=...) | 先行判定(Lookahead) | 後続の文字列が指定条件に一致する場合にマッチします。 |
| (?!...) | 否定先行判定 | 後続の文字列が指定条件に一致しない場合にマッチします。 |
| (?<=...) | 後行判定(Lookbehind) | 前方の文字列が指定条件に一致する場合にマッチします。 |
| (?<!...) | 否定後行判定 | 前方の文字列が指定条件に一致しない場合にマッチします。 |
1.2 ^ メタ文字
^ メタ文字は、文字列の先頭にマッチします。
使用例:
文字列が "Volardev" で始まるかどうかをテストします。
const pattern = /^Volardev/;
let text = "Volardev Tutorial";
let result = pattern.test(text); // true を返すconst pattern = /^Volardev/;
let text = "Hello Volardev";
let result = pattern.test(text); // false を返す1.3 $ メタ文字
$ メタ文字は、文字列の末尾にマッチします。
使用例:
文字列が "Volardev" で終わるかどうかをテストします。
const pattern = /Volardev$/;
let text = "Hello Volardev";
let result = pattern.test(text); // true を返すconst pattern = /Volardev$/;
let text = "Volardev tutorial";
let result = pattern.test(text); // false を返す1.4 \b メタ文字
\b メタ文字は、単語の先頭、または単語の末尾にマッチします。
使用例:
単語の先頭にある "LO" を検索します。
let text = "HELLO, LOOK AT YOU!";
// LOOK の先頭の LO にマッチする
let result = text.search(/\bLO/);単語の末尾にある "LO" を検索します。
let text = "HELLO, LOOK AT YOU!";
// HELLO の末尾の LO にマッチする
let result = text.search(/LO\b/);1.5 先行判定:Lookahead x(?=y)
x(?=y) は、"x" の後に "y" が続く場合にのみ "x" にマッチします。
使用例:
"Volardev" の後に " Tutorials" が続く場合にマッチさせます。
let text = "Volardev Tutorials";
let pattern = /Volardev(?= Tutorials)/;
let result = pattern.test(text); // true を返す1.6 否定先行判定:Negative Lookahead x(?!y)
x(?!y) は、"x" の後に "y" が続かない場合にのみ "x" にマッチします。
使用例:
let text = "Volardev Tutorials";
let pattern = /Volardev(?! Tutorials)/;
let result = pattern.test(text); // false を返す解説:
Volardevはリテラル文字列にマッチします。(?! Tutorials)は、直後に " Tutorials" が存在しないことをアサートします。text = "Volardev Tutorials"の場合、直後に該当文字列があるため結果はfalseになります。text = "Volardev Website"の場合、結果はtrueになります。
1.7 後行判定:Lookbehind (?<=y)x
(?<=y)x は、"x" の前に "y" がある場合にのみ "x" にマッチします。
使用例:
"Volardev" の前に "Hello " がある場合にマッチさせます。
let text = "Hello Volardev";
let pattern = /(?<=Hello )Volardev/;
let result = pattern.test(text); // true を返す1.8 否定後行判定:Negative Lookbehind (?<!y)x
(?<!y)x は、"x" の前に "y" がない場合にのみ "x" にマッチします。
使用例:
let text = "Hello Volardev";
let pattern = /(?<!Hello )Volardev/;
let result = pattern.test(text); // false を返す2. 正規表現のグループ (Groups)
正規表現のグループ化を使用すると、パターンの一部をまとめたり、マッチした内容を抽出したり、フラグを局所的に制御したりできます。
| 構文 | 説明 |
|---|---|
| (x) | x にマッチし、その内容を保存します(キャプチャ)。 |
| (?<n>x) | x にマッチし、n というラベルを付けて保存します(名前付きキャプチャ)。 |
| (?flag:x) | x に対して特定のフラグを有効にします。 |
| (?flag-flag:x) | x に対して特定のフラグを無効にします。 |
2.1 キャプチャグループ:Capturing Groups (x)
使用例:
let text = "Haha, haha, haha.";
const pattern = /(haha)+/;
let result = text.match(pattern);解説:
(haha)は一連の文字をグループとしてキャプチャします。(haha)+は、そのグループの1回以上の繰り返しにマッチします。text.match()は結果の配列(Array)を返します。
2.2 名前付きキャプチャグループ:Named Capturing Groups (?<n>)
使用例:
const text = "Name: John Doe";
// 名前付きキャプチャグループを使用
const regex = /(?<firstName>\w+) (?<lastName>\w+)/;
const match = text.match(regex);
// ラベル名を使ってアクセス可能
let fName = match.groups.firstName; // "John"
let lName = match.groups.lastName; // "Doe"解説:
(?<firstName>\w+)は単語をキャプチャし、firstNameというラベルを付けます。(?<lastName>\w+)も同様にlastNameとしてキャプチャします。text.match()はgroupsプロパティを持つ配列を返します。match.groupsは{firstName: "John", lastName: "Doe"}というオブジェクトを返します。
キャプチャグループを使用する場合、Stringメソッドの match() や RegExpメソッドの exec() は、groups プロパティを含むマッチオブジェクトを返します。このプロパティにグループ名と値が保持されます。
2.3 グループモディファイア:Group Modifiers (?flag)
(?flag) 構文は、パターンの一部に対してのみフラグを適用・変更できるインラインフラグ修飾子です。
使用例:i フラグ(大文字・小文字を区別しない)を、パターンの "Volardev" 部分のみに適用します。
let text = "Volardev tutorials.";
const pattern = /(?i:Vlardev) tutorials/;
// true を返す(Volardev の部分だけ i フラグが有効なため)
let result = pattern.test(text);別の例:
let text = "Volardev Tutorials.";
const pattern = /(?i:Volardev) tutorials/;
// false を返す("tutorials" の部分は i フラグが無効で、大文字の "T" にマッチしないため)
let result = pattern.test(text);