JavaScript 速習チュートリアル

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);