正規表現テスター
マッチをリアルタイムにハイライトして正規表現をテストします。
このツールについて
JavaScript の正規表現を書き、フラグを切り替えると、入力に合わせてすべてのマッチがハイライトされ、キャプチャグループと置換のプレビューも表示されます。
使い方
- パターン欄に正規表現を入力します。前後のスラッシュは不要です。
- フラグを切り替えます: g はすべてのマッチ、i は大文字と小文字を区別しない、m は複数行モードのアンカー、s は . を改行にもマッチさせる、u は Unicode です。
- テストするテキストを貼り付けると、すべてのマッチがハイライトされ、キャプチャグループが下に一覧表示されます。
- 「置換」をオンにすると、$1、$2、$<name> を使った置換結果をプレビューできます。
よくある質問
- これはどの正規表現の方言ですか?
- JavaScript(ECMAScript)です。日常的なパターンでは PCRE や Python とほぼ同じですが、後読みのサポート、名前付きグループの構文、一部のエスケープは言語によって異なります。
- ドットや括弧そのものにマッチさせるには?
- バックスラッシュでエスケープします。\. はドット、\( は丸括弧、\[ は角括弧にマッチします。[.] のような文字クラスの中では、ほとんどの文字が特別な意味を失います。
- .* と .*? の違いは何ですか?
- .* は貪欲(greedy)で、できるだけ多くにマッチします。.*? は怠惰(lazy)で、できるだけ少なくマッチします。2 つの目印の間のテキストを取り出すときは、通常は怠惰なマッチが適しています。
- 名前付きグループはどのように機能しますか?
- (?<name>...) と書くと、名前付きグループにキャプチャされます。その値はマッチの詳細に表示され、置換では $<name> として使えます。
- 正規表現が空文字列にマッチするのはなぜですか?
- a* や (\d+)? のようにすべてが省略可能なパターンは 0 文字にマッチすることがあり、それより長いマッチがない位置ではどこでもそうなります。「マッチの詳細」の表では、こうしたマッチは(空)と表示されます。* の代わりに + を使うか、パターンの少なくとも一部を必須にしてください。
- 置換でマッチ全体を使うには?
- マッチ全体には $&、番号付きグループには $1 や $2、名前付きグループには $<name>、ドル記号そのものには $$ と書きます。例えば \d+ を [$&] で置換すると、すべての数値が角かっこで囲まれます。最初の 1 つだけでなくすべての出現箇所を置換するには、g フラグをオンにしてください。
- 正規表現でブラウザーがフリーズすることはありますか?
- はい。(a+)+ や (\w+\s?)*$ のような入れ子の量指定子は、ほぼマッチするテキストに対して指数関数的にバックトラックすることがあり、これは壊滅的なバックトラック(catastrophic backtracking)と呼ばれます。マッチングはブラウザーのタブ内で実行されるため、タブを閉じるまでページが固まることがあります。(a+)+ の代わりに a+ とするなど、各文字が 1 通りの方法でしかマッチしないようにパターンを書き直してください。
正規表現のフラグ g、i、m、s、u の意味
正規表現のフラグは、パターン全体の動作を変えます。g(global)は最初のマッチで止まらず、すべてのマッチを見つけます。g がないと、このテスターは最初のマッチだけをハイライトし、「置換」も最初の出現箇所だけを変更します。これは JavaScript の String.replace とまったく同じ動作です。i は大文字小文字を無視するため、/error/i は Error にも ERROR にもマッチします。m は ^ と $ を各行の先頭と末尾にマッチさせます。ログファイルに対してパターンをテストするときに必要です。
dotall と呼ばれる s フラグを使うと、. が改行にもマッチするため、<p>.*?</p> が複数行にまたがってマッチできます。u フラグは Unicode モードを有効にします。基本多言語面(BMP)の外にある絵文字などの文字が 1 文字として数えられ、Unicode プロパティエスケープが使えるようになり、文字クラスの外の \- のような未知のエスケープは黙って受け入れられずにエラーになります。sticky の y フラグと、マッチ位置を得る d フラグはここでは使えません。
実際のデータで正規表現をテストする方法
正規表現は、うまくいくケースだけでなく、現実的なサンプルでテストしましょう。マッチすべき値とマッチすべきでない値の両方を含むテキストを貼り付けて、ハイライトを確認します。ISO 形式の日付なら、まず \d\d\d\d-\d\d-\d\d から始めて、2026-11-08 がハイライトされ、2026-1-8 がハイライトされないことを確認します。次に、12026-11-08 も部分的にマッチしてしまうことに気づくはずです。\b の単語境界、または m フラグ付きの ^ と $ を追加すれば解決します。
「マッチの詳細」の表には、すべてのマッチが位置とキャプチャグループ付きで一覧表示されます。グループには $1、$2 のように番号が付き、名前付きグループは名前で表示されるため、グループが期待どおりの内容をキャプチャしているかを確認する最も手早い方法です。メールアドレスについては、RFC に完全に従う実用的な正規表現は存在しないと割り切りましょう。[\w.+-]+@[\w-]+\.[\w.-]+ のようなパターンでタイプミスを検出し、本当の確認は確認メールで行います。URL を分解するには、代わりに URL エンコード・デコード・解析を使ってください。
テストした正規表現を JavaScript、Python、grep で使う
ここでテストしたパターンは、/\d+/g のような JavaScript の正規表現リテラルに、追加のエスケープなしでそのまま使えます。new RegExp() や他の多くの言語のように文字列から組み立てる場合は、バックスラッシュをすべて二重にする必要があり、通常の文字列リテラルでは \d+ が "\\d+" になります。Python の r"\d+" のような raw 文字列や Go のバッククォート文字列なら、二重にする必要はありません。これを忘れることが、テスターでは動く正規表現がコードでは動かない最もよくある原因です。
フラグの指定場所は言語によって異なります。Python では re.IGNORECASE かインラインの (?i) を使い、grep では大文字小文字の区別に -i を使い、構文は -E や -P で選びます。後読みにも違いがあります。JavaScript は可変長の後読みを使えますが、Python の re モジュールは固定長が必要なため、(?<=\$|USD )\d+ はエラーになります。grep・ripgrep コマンドビルダーを使えば、テスト済みのパターンを、すべてのフラグの説明付きですぐに実行できるコマンドに変換できます。
うまく動かない、または結果がおかしいですか? このツールの問題を報告