正規表現テスター:オンラインでRegexをテスト&デバッグ

パターンを入力し、テスト文字列を貼り付けると、マッチが即座にハイライトされます。キャプチャグループ、フラグ、エラーメッセージもすべて入力中にリアルタイム更新。JavaScript正規表現エンジン使用(ブラウザやNode.jsと同じ)。データはブラウザから出ません。

正規表現パターン
正規表現を入力
//

フラグ

テスト文字列
テストする文字列を入力
正規表現をテスト・デバッグ

Character Classes

  • . Any character
  • \d Digit (0-9)
  • \w Word character
  • \s Whitespace

Quantifiers

  • * 0 or more
  • + 1 or more
  • ? 0 or 1
  • {n,m} n to m times

Anchors

  • ^ Start of line
  • $ End of line
  • \b Word boundary
  • \B Non-word boundary

90秒でわかる正規表現

正規表現はテキストパターンを記述するためのミニ言語です。パターン \d{3}-\d{4} は "555-1234" のような電話番号にマッチ。パターン ^From:.+$ は "From:" で始まるメールヘッダー行にマッチ。シンプルなコンセプトだが、構文はすぐに密になる。

JavaScriptはECMAScript正規表現フレーバー(ECMA-262で定義)を使用。他のフレーバーとの主な違い:古いエンジンではルックビハインドなし(ES2018で追加)、所有量化子なし、アトミックグループなし。PythonやPCREから正規表現を移植する場合はこれらのギャップに注意。

最もよく見かけるミス:. がデフォルトで改行にマッチしないことを忘れること。テスト文字列に改行があり、パターンに .* を使っていると、予期しない部分マッチが発生する。sフラグ(dotAll)を追加するか、代わりに [\s\S]* を使用。

パフォーマンスの罠:(a+)+ や (.*a){20} のようなネストされた量化子は壊滅的バックトラッキングを引き起こす可能性がある。エンジンが指数的に多くのパスを試行。30文字の入力でブラウザが数分間ハングする。このツールはブラウザで実行されるので、悪いパターンはこのタブだけをフリーズさせ、本番サーバーには影響しない。まずここでテスト。

使い方

  1. 正規表現パターンを入力。デリミタ不要(パターンだけ、/pattern/ ではなく)。
  2. フラグを設定:g(全マッチ)、i(大文字小文字無視)、m(複数行)、s(ドットが改行にマッチ)。
  3. テスト文字列を貼り付け。マッチがリアルタイムでハイライト。
  4. 下のキャプチャグループを確認。各 () グループのマッチ内容が個別に表示。

使用場面

ユーザー入力フォーマットの検証

メール、電話番号、郵便番号、クレジットカード。すべてにパターンがある。バリデーションコードに入れる前にここで正規表現を構築してテスト。

ログファイルからのデータ抽出

サーバーログ、CSVファイル、APIレスポンスなど、非構造化テキストからタイムスタンプ、IP、エラーコードを取り出す必要がある時。キャプチャグループでパターンを構築し、サンプルログ行でテストしてスクリプトで使用。

コードエディタでの検索と置換

VS Code、IntelliJ、Sublimeなど、すべて正規表現による検索置換をサポート。ここでテストケースとともにパターンを構築し、エディタに貼り付け。リファクタリングに特に便利。

「動くはずなのに動かない」正規表現のデバッグ

パターンを書いたが、ある入力では動くが他では失敗する。失敗する入力をここに貼り付けて、マッチがどこで途切れるか正確に確認。大抵はエスケープ漏れ(\. vs .)、貪欲 vs 怠惰量化子(.* vs .*?)、またはフラグ不足。

よくある落とし穴

1.

特殊文字をエスケープする

正規表現では . * + ? ^ $ { } [ ] ( ) | \ すべてに特別な意味がある。リテラルのドットにマッチさせるには \. を使う。ただのドットではなく。

2.

貪欲 vs 怠惰:.* vs .*?

.* はできるだけ多く取得(貪欲)、.*? はできるだけ少なく取得(怠惰)。迷ったら .*? で怠惰にして具体性を追加。

3.

アンカーが重要:^ と $ と複数行フラグ

mフラグなしでは ^ は文字列全体の先頭のみ、$ は末尾のみにマッチ。mフラグありでは各行の先頭/末尾にマッチ。複数行テキストを処理していてパターンに ^ を使っているなら、おそらく m フラグが必要。

4.

壊滅的バックトラッキングを避ける

(a+)+ や (x+x+)+y のようなパターンはマッチしない入力で指数的時間がかかる可能性がある。重複する文字クラスで量化子をネストしないこと。

日付コンポーネントの抽出

番号付きグループでISO日付フォーマットから年、月、日をキャプチャ。

Input

(\d{4})-(\d{2})-(\d{2})

Output

入力 "2024-03-15" → グループ1: "2024", グループ2: "03", グループ3: "15"

メールパターンのマッチ

簡略化されたメールパターン(RFC 5322準拠ではないが、明らかな非メールを検出)。

Input

[\w.+-]+@[\w-]+\.[a-zA-Z]{2,}

Output

"[email protected]"、"[email protected]" にマッチ

機能

  • リアルタイムマッチング。入力中に結果更新、送信ボタン不要
  • すべてのJavaScriptフラグ:g、i、m、s、u、v、y
  • 番号付きキャプチャグループ表示
  • 説明的メッセージ付き構文エラーハイライト
  • マッチ数と位置インジケーター
  • 100%ブラウザ内で動作。データはどこにも送信されない

よくある質問

なぜPythonで動く正規表現がここでは動かない?

正規表現フレーバーが異なる。PythonはPCRE風構文でJavaScriptにない機能を持つ:ルックビハインド(ES2018で追加、古いブラウザ非対応)、アトミックグループ、所有量化子(a++)、冗長モード(xフラグ)。最も一般的な問題:Pythonのre.DOTALLはJavaScriptのsフラグに相当。

複数行にまたがってマッチするには?

2つの選択肢:(1) sフラグを追加すると . が改行文字にマッチするようになる。(2) . の代わりに [\s\S] を使えば、sフラグなしで改行を含む任意の文字にマッチ。行ごとにマッチするにはmフラグで ^ と $ を行境界にマッチさせる。

(?: ) と ( ) の違いは?

( ) はキャプチャグループで、マッチしたテキストを後で使うためにキャプチャ(後方参照、抽出)。(?: ) は非キャプチャグループで、量化子や選択のためにグループ化するがキャプチャしない。キャプチャ値が不要な時に (?: ) を使う。少し速く、グループ番号が整理される。

なぜ正規表現でページがフリーズする?

壊滅的バックトラッキング。重複する文字にネストした量化子を持つパターン((a*)*b や (.+)+$ など)はマッチしない入力で指数的時間がかかる。エンジンが諦める前にすべての可能な組み合わせを試行する。修正:量化子をより具体的にするか、同じ文字での量化子ネストを避けるよう再構築。

特殊文字をリテラルでマッチするには?

バックスラッシュでエスケープ:\. でドット、\* でアスタリスク、\( で括弧、\\ でバックスラッシュ自体。文字クラス [ ] 内ではほとんどの特殊文字は意味を失う(] \ ^ - を除く)。迷ったらエスケープ。不要なエスケープは無害、漏れたエスケープはバグ。

ヒントと関連ワークフロー