正規表現テストツール
正規表現をリアルタイムテスト・デバッグ、マッチ結果をハイライト表示しコード生成
正規表現とは?
正規表現(Regular Expression、略称regexまたはregexp)は、テキストの照合、検索、置換を行うための強力なツールです。特定の構文ルールを使用してテキストパターンを記述し、入力フォーマットの検証、特定内容の抽出、テキストの一括置換などを素早く行うことができます。正規表現はプログラミング、データ処理、テキスト編集などのシーンで広く使用されています。
使い方
使い方
- 左側の入力欄にregexパターンを入力します
- 必要なフラグを選択してください(例:gでグローバル、iで大文字小文字を区別しない)
- 右側にテストテキストを入力します
- ハイライトされた一致箇所と詳細を確認できます
regexのヒント
- 一致する例と一致しない例の両方でテストすると、範囲が広すぎるパターンを発見しやすくなります。
- 長いテキストで量詞をネストする際は注意してください。過度なバックトラッキングによりパターンが極端に遅くなる場合があります。
利用シーン
仕組み
テスターは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 ネイティブの正規表現エンジンを使ってブラウザ内で実行されます。パターンも入力も送信されません。