App Museum
English

JavaScript正規表現フラグの使い分け

g、i、m、s、u、yの役割と組み合わせを具体例で比較し、複数一致、状態、改行、Unicodeの結果を確認します。

公開日: 2026-08-10 · 更新日: 2026-08-10

主要フラグの役割

JavaScriptの正規表現フラグは、同じパターンをどのように検索するかを変えます。

  • g(global)は最初の一致だけでなく、後続の一致も探します。
  • i(ignore case)は大文字と小文字を区別しない照合を行います。
  • m(multiline)は ^$ を文字列全体だけでなく各行の先頭と末尾にも一致させます。
  • s(dotAll)は . が改行文字にも一致するようにします。
  • u(Unicode)はパターンと入力をUnicodeコードポイントを考慮して扱います。
  • y(sticky)は lastIndex が示す位置から始まる一致だけを許可します。

フラグはパターン本文とは別に指定します。App Museumの正規表現テスターでは、たとえばパターン欄へ error、フラグ欄へ gi と入力します。

gによる複数一致と状態変化

対象が ID-12 ID-34、パターンが \d+ の場合、g なしの一般的な検索は最初の 12 だけを返し、g を使った全体検索は 1234 を返します。テスターは一致一覧を作るため内部で全体を走査するので、実際のコードで使うメソッドとフラグの組み合わせも別に確認してください。

g または y を持つRegExpオブジェクトで exec()test() を繰り返すと、次の開始位置が lastIndex に保存されます。同じオブジェクトを別の入力や別の処理で再利用すると、先頭から検索しない場合があります。期待しない結果が出たら、lastIndex、RegExpオブジェクトの再利用、呼び出したメソッドを確認します。

空文字列へ一致するパターンでは位置が進まない問題もあります。先読みや境界を使う場合は、関連ガイド「正規表現のゼロ幅一致を安全にテストする方法」で位置と反復処理も確認してください。

mとsは変更する対象が違う

m はアンカー、s はドットの意味を変えます。どちらも「複数行用」とまとめて考えると誤りやすいフラグです。

input:
first
error

pattern: ^error$
flags: m
expected: error on the second line

一方、パターン first.*error は、フラグなしでは . が改行へ一致しないため失敗します。s を付けると改行をまたいで一致します。m を付けても . の範囲は変わりません。

Unicode文字と絵文字を確認する

JavaScript文字列では、基本多言語面の外にある絵文字がUTF-16の2コード単位になることがあります。入力が単独の 😀 でパターンが ^.$ の場合、u なしでは1個の . が絵文字全体を表せず、u 付きでは1コードポイントとして一致します。

i を付ければすべての言語で人間が期待する同一視ができる、とは限りません。Unicodeの大文字・小文字変換、結合文字、正規化された表記は別の問題です。アクセント付き文字、結合文字、絵文字を扱う場合は、実際の入力例をテストし、必要なら正規化方針も決めてください。

フラグを組み合わせて比較する

次の入力でパターン ^error:.*timeout$ を試します。

INFO: ready
Error:
timeout
ERROR: timeout
  • gm では大文字小文字が異なり、改行も . を通らないため一致しません。
  • gim では4行目の ERROR: timeout に一致します。
  • gims では2行目の Error: から4行目の ERROR: timeout まで一致できます。貪欲な .* の範囲が広がるため、意図より長く一致しないか確認します。

y は字句解析のように「現在位置から必ず次のトークンを読む」用途に向きます。通常の全文検索で途中の候補を探す g とは失敗条件が異なるため、lastIndex を明示した小さな例で検証してください。

よくある失敗と確認手順

  1. パターン、フラグ、入力を別々に記録します。
  2. フラグを一つずつ追加し、一致数、開始位置、一致文字列を比較します。
  3. 先頭・末尾、改行の有無、大文字小文字、絵文字を含む境界例を試します。
  4. gy では同じRegExpオブジェクトを連続実行し、lastIndex の変化も確認します。
  5. 本番と同じJavaScriptメソッドで最終確認します。

入力に応じて反復回数が急増する、深い入れ子や曖昧な繰り返しを持つ複雑なパターンは、長い不一致入力でも時間を測ってください。すべての正規表現が危険という意味ではありませんが、外部入力を扱う場合は入力長の上限や単純なパターンへの分割も検討します。

参考資料

開発者向けregexjavascriptflagsunicodepattern-testing
  • 正規表現パターンをテキストに対して試し、マッチ箇所をハイライトしてキャプチャグループも確認できます。
    ユーティリティ開発者向けregexregexppatterntestdeveloper