ToolActToolAct

正規表現テストツール

正規表現をリアルタイムテスト・デバッグ、マッチ結果をハイライト表示しコード生成

正規表現
//g
フラグ
gglobal
iignore case
mmultiline
sdotAll
uunicode
よく使う例
テストテキスト
マッチ結果0 件マッチ
マッチ結果なし

正規表現とは?

正規表現(Regular Expression、略称regexまたはregexp)は、テキストの照合、検索、置換を行うための強力なツールです。特定の構文ルールを使用してテキストパターンを記述し、入力フォーマットの検証、特定内容の抽出、テキストの一括置換などを素早く行うことができます。正規表現はプログラミング、データ処理、テキスト編集などのシーンで広く使用されています。

使い方

使い方

  1. 左側の入力欄にregexパターンを入力します
  2. 必要なフラグを選択してください(例:gでグローバル、iで大文字小文字を区別しない)
  3. 右側にテストテキストを入力します
  4. ハイライトされた一致箇所と詳細を確認できます

regexのヒント

  • 一致する例と一致しない例の両方でテストすると、範囲が広すぎるパターンを発見しやすくなります。
  • 長いテキストで量詞をネストする際は注意してください。過度なバックトラッキングによりパターンが極端に遅くなる場合があります。

利用シーン

JavaScript正規表現をライブでテストするパターンを入力しフラグg、i、m、s、uを選択して、サンプルテキストに対してハイライト付きのマッチテストを行います。無効なregex構文は即座に検出され、長さ0のグローバルマッチはループロックなしで処理されます。リアルタイムフィードバックにより、コンソールでスクリプトを実行したりパターンを変えるたびにエディタを再起動したりするより高速な反復調整が可能です。
マッチ位置と名前付きグループを確認する各マッチはテキスト、開始・終了オフセット、名前付きキャプチャグループがある場合はそれも表示されます。ログの抽出パターン、フォームバリデーション、インポートルール、データクリーニングスクリプトの調整に便利です。可視オフセットにより、ソースファイル内の文字位置を追跡するより広いパイプラインに同じパターンを組み込むことができます。
動作確認済みパターンをコードスニペットに変換するメール、URL、IP、日付、色、中国語テキスト、数字、空白のビルトインサンプルを適用し、選択したフラグを使ってJavaScript、Python、Java、PHP、またはGoのコピー可能なスニペットを生成します。各言語でサポートされているフラグが反映されるため、生成されたスニペットのランタイム動作はページ上でテストしたものと一致します。
catastrophic backtrackingと暴走マッチをデバッグする長い文字列やアドバーサリアルな文字列をテスターに貼り付けて、(a+)+や.*foo.*のようなネストされた量詞がエンジンをフリーズさせることを確認します。マッチ数と各マッチのオフセットを監視し、イテレーションが停滞したりメモリが急増したりした場合は、アトミックグループ、所有量詞、アンカーの厳密化で簡素化しましょう。優良なパターンは最悪ケースの入力でも指数的な爆発を起こさずに耐えられます。
貪欲量詞と遅延量詞、lookbehind、\p{L}を比較するテスターを使って貪欲量詞(.*)と遅延量詞(.*?)が同じテキストで異なるプレフィックスを拾う様子を確認し、JavaScriptとPCREで利用可能だがすべての古いエンジンで使えるわけではないlookbehind(?<=)のサポートをチェックします。uフラグを有効にすると\p{L}(任意の文字)や\p{Sc}(通貨記号)などのUnicodeプロパティクラスが使えるため、ラテン文字、キリル文字、漢字間でパターンの正確さを保てます。

仕組み

テスターはECMAScript言語仕様で定義されたRegExpエンジンを基盤としています。ECMAScriptの正規表現はバックトラッキングNFA実装です:エンジンは各選択肢を左から右の順に試行し、量詞が失敗した場合に巻き戻します。これによりlookaroundや後方参照が可能になりますが、悪意のある入力に対する catastrophic backtracking が発生する原因ともなります。認識する6つのフラグはg(グローバル)、i(大文字小文字を区別しない)、m(複数行、行ごとにアンカー)、s(dotAll、「.」が改行にマッチ)、u(Unicodeモード)、y(sticky、lastIndexにアンカー)です。 フラグ間でマッチングのセマンティクスは大きく異なります。/uの下では、エンジンはパターンをUTF-16コードユニットではなくUnicodeコードポイントのシーケンスとして扱うため、サロゲートペアは1文字としてマッチし、\p{L}(任意の文字)、\p{Sc}(通貨記号)、\p{Script=Han}などのUnicodeプロパティクラスが利用可能になります。名前付きキャプチャグループ(?<name>...)とlookbehind(?<=...)はES2018の一部で、Chromium 64+、Firefox 78+、Safari 16.4+で対応していますが、アトミックグループ(?>...)や所有量詞(a++)などのPCRE固有機能は仕様に含まれていません。 本番環境で最大の危険はReDoSです。(a+)+bのようなパターンが入力'aaaaaaaaaaaaaaaa!'に対して指数的なパスを探索するのは、2つのネストされた量詞が同じ文字列を多くの方法で分割できるためです。緩和策はよく知られています:同じ文字クラスに対するネストされた量詞を避け、可能な限り^と$でアンカーし、エンジンが対応していればアトミックグループを優先し、またはGoのRE2のような線形時間エンジンに切り替えます(RE2は後方参照とlookbehindを犠牲にしてO(n)マッチングを保証します)。サーバーサイド検証に向けられた信頼できない入力に対しては、RE2または手書きパーサーがほぼ常に安全な選択です。

  • エンジン:ECMAScript RegExpはバックトラッキングNFAであり、DFAではない。これによりlookaroundと後方参照が可能になるが、catastrophic backtrackingも引き起こす。
  • フラグ:g(グローバル)、i(大文字小文字を区別しない)、m(行ごとに^/$)、s(dotAll、「.」が\nにマッチ)、u(Unicodeモード、サロゲート認識)、y(sticky、lastIndexにアンカー)。
  • Unicodeモード:/uでコードポイントマッチングと\p{L}(文字)、\p{Sc}(通貨)、\p{Script=Han}がアンロック。/uなしでは[a-zA-Z]+は非ラテン語の単語をすべて見逃す。
  • モダン構文の利用可能性:名前付きキャプチャ(?<n>...)とlookbehind(?<=...)はChromium 64+、Firefox 78+、Safari 16.4+で対応。アトミックグループ(?>...)と所有量詞(a++)はECMAScriptに含まれない。
  • ReDoS:同じクラスに対するネストされた量詞(例:(a+)+b)は指数的に爆発。アンカー、アトミックグループで厳密化するか、信頼できない入力にはRE2 / re2-wasmに移行。
  • 計算量の下限:固定アルファベット上のリテラルアンカー付きパターンはO(n)で実行。後方参照と制限のないlookaroundは最悪の場合を指数的に増大させるため、リリース前に adversarial な入力でベンチマークを取ること。

使用例

メールアドレスのマッチ

パターン: ^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$
フラグ:   gi

入力:   contact: alice@example.com, bob_2024@mail.co.uk, invalid@.com
一致:   alice@example.com, bob_2024@mail.co.uk  (2 件)

ログから IPv4 アドレスを抽出

パターン: \b(?:\d{1,3}\.){3}\d{1,3}\b
フラグ:   g

入力:   2026-06-15 ERROR client 192.168.1.42 connect failed (peer 10.0.0.1)
一致:   192.168.1.42, 10.0.0.1

名前付きグループで日付を分解

パターン: (?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})
フラグ:   g

入力:   Sprint window: 2026-09-01 to 2026-09-15
グループ: {year:'2026', month:'09', day:'01'}, {year:'2026', month:'09', day:'15'}

貪欲 vs 非貪欲な量指定子

入力:   <b>hello</b> <i>world</i>

.*  (貪欲)-> 行全体に一致: <b>hello</b> <i>world</i>
.*? (非貪欲)-> 最初の一致のみ: <b>hello</b>

タグ間をスクレイピングする場合は通常、非貪欲が望ましい挙動です。

Unicode 対応の文字クラス

パターン: \p{L}+
フラグ:   gu

入力:   Hello, 北京! Café Москва
一致:   Hello, 北京, Café, Россия

u フラグと \p{L} がないと、[a-zA-Z]+ は非 Latin の単語をすべて取りこぼします。

よくある質問

このテスターはどの正規表現フレーバーを使用していますか?

JavaScript の正規表現エンジン(ECMAScript)です。一般的な機能は PCRE と似ていますが、エッジケースで異なります:所有量指定子なし、再帰なし、後読みは新しめのブラウザが必要、名前付きグループは (?<name>...) を使用するなど。Python(re/regex)、Java、.NET、PCRE では同じパターンでも挙動が異なる場合があるため、実環境でも必ずテストしてください。

どのフラグがサポートされていますか?

g(グローバル、すべての一致を検索)、i(大文字小文字を区別しない)、m(複数行、^ と $ が行境界に一致)、s(dotall、. が改行にも一致)、u(Unicode)、y(sticky)、d(hasIndices)。トグル行から選択でき、テストテキストでの効果がページ上で確認できます。

なぜ期待より少ない結果しか一致しないのですか?

g フラグなしでは regex.exec は 1 件のみ返します。m なしでは ^ と $ は入力全体の先頭・末尾にしか一致しません。u なしではサロゲートペアの文字(絵文字)が 2 つの半分として扱われます。「動かない」原因のほとんどはフラグの付け忘れです。

絵文字や CJK 文字を一致させるには?

u フラグを使って Unicode を正しく扱えるようにします。\p{...} 文字クラス(\p{Letter}、\p{Script=Han}、\p{Emoji})で Unicode プロパティ単位の一致が可能です。u なしでは [a-zA-Z] でアクセント付き文字に一致しないため、[a-zA-ZÀ-ÿ] に拡張するか \p{L} を使ってください。

パターンからコードを生成できますか?

ほとんどのバージョンで、JavaScript、Python、PHP、Ruby、Go、Java の構文として適切なエスケープを施してエクスポートできます。ただし、同じパターンでもエンジンによって挙動が異なる(貪欲性のデフォルト、文字クラスの扱い、先読み・後読みのサポート等)ため、必ず対象言語でもテストしてください。

貪欲量指定子と非貪欲量指定子の違いは何ですか?

貪欲(* + ?)はできるだけ多く一致させ、必要に応じてバックトラックします。非貪欲(*? +? ??)はできるだけ少なく一致させます。「A と B の間をすべて抽出」する場合、複数の B があると貪欲な .* は行き過ぎますが、非貪欲な .*? は最初の B で止まります。内側の内容を抽出する用途では非貪欲をデフォルトにすると安全です。

正規表現やテストテキストはアップロードされますか?

いいえ。マッチング処理は JavaScript ネイティブの正規表現エンジンを使ってブラウザ内で実行されます。パターンも入力も送信されません。