JavaScript正規表現フラグと先読み・後読みの完全使い分け
公開: 2026-06-16・対象: 実装者
MDNのリファレンスを読んでも『結局いつどれを使うか』が掴みにくい、フラグと先読み・後読みを実例で整理します。サクラエディタ・VS Code・Pythonとの方言差にも触れます。
ECMAScript正規表現の全7フラグ
| フラグ | 名前 | 効果 | 使う場面 |
|---|---|---|---|
| g | global | 最初の1件で止めず全部探す | 基本これを付ける |
| i | ignoreCase | 大文字小文字を区別しない | URLパス・タグ抽出 |
| m | multiline | ^と$を行ごとに効かせる | 複数行ログ |
| s | dotAll | .を改行にもマッチさせる | 複数行HTML/XML |
| u | unicode | Unicodeプロパティ\p{...}を有効化 | 絵文字・漢字判定 |
| v | unicodeSets | u を拡張、集合演算(差・積)対応 | ES2024 / 2024〜 |
| y | sticky | lastIndexの位置からのみ探す | 字句解析器の実装 |
日常用途では 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年時点で対応していない環境は事実上ありません。
他言語・他ツールとの方言差
- Python:
reモジュールは概ね同じ。先読み・後読みOK。フラグはre.IGNORECASEなど定数で指定。 - Java:
java.util.regexは概ね同じ。改行はPattern.DOTALL。UnicodeはPattern.UNICODE_CHARACTER_CLASS。 - サクラエディタ:先読みは可、後読みは不可。
\dや\wが ASCII 限定。 - VS Code 検索:JavaScript準拠なので、本ツールと挙動が一致します。
- grep(POSIX BRE):
\dが使えない([0-9])など、シンプルな部分集合。-E(ERE)や-P(PCRE互換)を使うことが多い。
v フラグ(ES2024)の集合演算
2024年に標準化されたvフラグでは、文字クラス内で集合演算が書けます。
// 漢字のうち、JIS第1水準以外を全部マッチ
/[\p{Script=Han}--[\p{Script=Han}&&\p{ASCII}]]/v
// 絵文字のうち、フラグ絵文字を除く
/[\p{Emoji}--\p{Emoji_Flag_Sequence}]/v--(差集合)・&&(積集合)が使えるため、これまで自前で否定や交差を書いていた箇所が劇的にシンプルになります。
補足
- ・本記事は2026-06-16時点のECMAScript仕様(ES2024まで)に基づいています。各フラグのサポート状況はMDN『正規表現ガイド』『RegExp』ページの最新版もご確認ください。
- ・vフラグは比較的新しいため、ターゲットブラウザが古い場合はトランスパイラ(Babel等)対応の可否を事前に確認してください。
フラグを切り替えて挙動を確かめる
本サイトの正規表現チェッカーで、g/i/m/sの切替挙動が即時で見られます:正規表現チェッカー