手軽屋
ツール一覧

JavaScript正規表現フラグと先読み・後読みの完全使い分け

公開: 2026-06-16・対象: 実装者

MDNのリファレンスを読んでも『結局いつどれを使うか』が掴みにくい、フラグと先読み・後読みを実例で整理します。サクラエディタ・VS Code・Pythonとの方言差にも触れます。

ECMAScript正規表現の全7フラグ

フラグ名前効果使う場面
gglobal最初の1件で止めず全部探す基本これを付ける
iignoreCase大文字小文字を区別しないURLパス・タグ抽出
mmultiline^と$を行ごとに効かせる複数行ログ
sdotAll.を改行にもマッチさせる複数行HTML/XML
uunicodeUnicodeプロパティ\p{...}を有効化絵文字・漢字判定
vunicodeSetsu を拡張、集合演算(差・積)対応ES2024 / 2024〜
ystickylastIndexの位置からのみ探す字句解析器の実装

日常用途では g・i・m・s の4つで十分です。u は絵文字や漢字を扱うときに必須、v は2024年標準化された集合演算機能を使うとき、y はパーサ実装など特殊な場面で使います。

先読み(lookahead):マッチした後ろを覗き込む

A(?=B) は『A の直後に B が続いている』ときだけ A にマッチします。B 自体はマッチ結果に含まれません。

// 数字の直後に「円」が続いているときだけ数字にマッチ
"100円と200ドルと300円" .match(/\d+(?=円)/g)
// → ["100", "300"]

// 否定先読み:「円」が続いていないときだけ
"100円と200ドル" .match(/\d+(?!円)/g)
// → ["200"](ただし"100"も先頭2文字"10"がヒットする副作用に注意)

後読み(lookbehind):マッチした前を覗き込む

(?<=B)A は『A の直前に B がある』ときだけ A にマッチします。

// 「¥」の直後の数字
"¥1000と$50と¥3000" .match(/(?<=¥)\d+/g)
// → ["1000", "3000"]

// 否定後読み:「¥」が直前にない数字
"¥1000と$50" .match(/(?<!¥)\d+/g)
// → ["50"]

後読みは2018年(ES2018)から正式採用されました。それ以前のサポートが必要な古いブラウザでは使えませんが、2026年時点で対応していない環境は事実上ありません。

他言語・他ツールとの方言差

v フラグ(ES2024)の集合演算

2024年に標準化されたvフラグでは、文字クラス内で集合演算が書けます。

// 漢字のうち、JIS第1水準以外を全部マッチ
/[\p{Script=Han}--[\p{Script=Han}&&\p{ASCII}]]/v

// 絵文字のうち、フラグ絵文字を除く
/[\p{Emoji}--\p{Emoji_Flag_Sequence}]/v

--(差集合)・&&(積集合)が使えるため、これまで自前で否定や交差を書いていた箇所が劇的にシンプルになります。

補足

フラグを切り替えて挙動を確かめる

本サイトの正規表現チェッカーで、g/i/m/sの切替挙動が即時で見られます:正規表現チェッカー