Pack Camo

JavaScript 正規表現テスター

JavaScript の正規表現を、リアルタイムのマッチ、グループ、置換で試せます。 処理はすべて端末内で完結し、アップロードは一切ありません。

入力
Pattern · flags · test text
出力
Matches · groups · replaced text

テスト用テキスト

マッチングではなくスケジュールを扱いますか? cron 式ジェネレーターを開く

入力しながら正規表現をテスト

この正規表現テスターは、お使いのブラウザの JavaScript エンジン、つまり Node.js やフロントエンドのコードが使うのと同じエンジンでパターンを実行し、入力に合わせてテスト用テキスト内のすべてのマッチをハイライトします。その横には、位置とキャプチャグループ付きのマッチ一覧、置換のプレビュー、パターンの各部分が何をするかを 1 行ずつ説明する解説が表示されます。パターンとテキストがページの外に出ることはありません。

正規表現をテストする方法

  1. スラッシュの間にパターンを入力します(前後の /…/ は不要です)。よく使うパターンメニューから読み込むこともできます。
  2. フラグのオン・オフを切り替えます。すべてのマッチを見つけるなら g、大文字・小文字を無視するなら i、^ と $ を行ごとに働かせるなら m、などです。
  3. テスト用のテキストを貼り付けるか入力します。隣り合うマッチも区別できるよう、マッチは交互の色でハイライトされます。
  4. 各マッチの位置とグループはマッチ、わかりやすい分解は解説、$1、$<name>、$& を使った置換のプレビューは置換で確認できます。

JavaScript の正規表現のフラグ

g(global)
最初のマッチで止まらず、すべてのマッチを見つけます。置換もすべてに対して行われます。
i(ignore case)
大文字・小文字を区別せずにマッチするので、/cat/i は Cat にも CAT にもマッチします。
m(multiline)
^ と $ が、テキスト全体だけでなく各行の先頭と末尾にマッチします。
s(dotAll)
ドットが、通常はスキップする改行にもマッチします。
u(unicode)
パターンを Unicode のコードポイントとして扱います。絵文字は 1 文字と数えられ、\p{…} のプロパティエスケープが使えます。構文はより厳密になります。
v(unicodeSets)
u の後継となる新しく厳密なフラグで、文字クラス内で [\p{L}--[a-z]] のような集合演算が使えます。ブラウザが対応している場合のみ表示されます。
y(sticky)
各マッチが、前のマッチが終わった位置からちょうど始まる必要があります。トークナイザーに便利です。

グループ、後方参照、置換

かっこはキャプチャします。(\d{4})-(\d{2}) は年をグループ 1、月をグループ 2 に保存します。(?<year>\d{4}) のようにグループに名前を付けると、コードでは groups.year、置換では $<year> としても使えます。選択肢や量指定子のためにグループ化は必要だがキャプチャはしたくない場合は (?:…) を使ってください。

パターンの中では、\1 や \k<name> が、前にグループがキャプチャしたのと同じテキストにマッチします。ライブラリの重複語パターンが「the the」を見つけるのはこの仕組みです。(?=…)、(?!…)、(?<=…)、(?<!…) などの先読み・後読みは、前後にあるものを消費せずに確認します。強力なパスワードのパターンは、4 つの先読みで各種類の文字を必須にしています。

置換文字列では、$& がマッチ全体、$1〜$99 が番号付きグループ、$<name> が名前付きグループ、$` と $' がマッチの前後のテキスト、$$ が文字どおりのドル記号を挿入します。

量指定子:最長一致と最短一致

量指定子は、直前の要素を何回繰り返せるかを指定します。* は 0 回以上、+ は 1 回以上、? は 0 回または 1 回、{2,5} は 2 回以上 5 回以下です。既定では最長一致(貪欲)で、できるだけ多くのテキストを取り、パターンの残りが失敗すると少しずつ戻します。疑問符を付けると最短一致(怠惰)になります。<.+?> は HTML タグ 1 つにマッチしますが、<.+> は行の最初の < から最後の > までにマッチします。

解説タブでは、パターン内のすべての量指定子についてこれを明示するので、どの部分が何回繰り返し、最長一致か最短一致かが一目でわかります。[A-Za-z0-9_] のような文字クラスは範囲ごとに、\d、\w、\s などのエスケープは名前付きで示されるので、他人から引き継いだパターンもずっと早く読めます。

壊滅的なバックトラッキングと、このテスターが固まらない理由

パターンによっては、ほぼマッチする入力に対して指数関数的な時間がかかります。典型例は、a が長く続いた後に b が来る入力に対する (a+)+$ です。エンジンは諦めるまでに、a を内側と外側の繰り返しに分けるあらゆる方法を試します。本番環境ではこれは ReDoS と呼ばれる現実のサービス拒否のリスクです。

ここではマッチングを時間制限付きの別のバックグラウンドワーカーで実行します。パターンに時間がかかりすぎるとワーカーが停止され、タブが固まる代わりに警告が表示されます。一般的な対処法は、同じ文字に対する入れ子の量指定子を取り除く、選択肢を互いに排他的にする、パターンにアンカーを付ける、のいずれかです。結果は最大 10,000 件のマッチまでです。

JavaScript に特化した regex101 の代替

regex101 などのツールは複数の正規表現の方言に対応していますが、このツールはあえてブラウザの ECMAScript エンジン 1 つだけに対応しています。そのため、ここでマッチするものは JavaScript と TypeScript でもマッチします。強欲な量指定子、アトミックグループ、再帰などの PCRE の機能は JavaScript にはなく、解説ではそれらの構文を文字どおりに扱います。ライブラリには、メールアドレス、URL、IPv4・IPv6 アドレス、ISO 形式の日付、16 進数のカラーコード、UUID、E.164 形式の電話番号、スラッグ、24 時間表記の時刻、強力なパスワードなど、日々よく検索されるパターンを収録しています。いずれも実用的なパターンであって、RFC の完全な文法ではありません。重要な入力は専用のパーサーでも検証してください。

文字列ではなくスケジュールを扱うなら、cron 式ジェネレーターが、このツールが正規表現を解説するのと同じように cron 構文を解説します。

よくある質問

このテスターはどの正規表現の方言を使っていますか?
JavaScript(ECMAScript)で、お使いのブラウザ自身のエンジンで実行されます。結果は、同じバージョンの Node.js、Deno、Bun、ブラウザでの RegExp、String.prototype.match、replace の動作と一致します。
複数行にまたがってマッチさせるには?
m フラグをオンにすると ^ と $ が各行にマッチし、ドットを改行にもマッチさせたい場合は s フラグもオンにします。s を使わない場合は、[\s\S] で改行を含む任意の文字にマッチさせられます。
名前付きキャプチャグループを置換で使うには?
(?<name>…) でグループに名前を付け、置換文字列では $<name> として参照します。番号付きグループは $1、$2 などで、$& はマッチ全体を挿入します。
正規表現が最初のマッチしか見つけないのはなぜですか?
g フラグがないと、JavaScript の正規表現は最初のマッチで止まり、replace もそれだけを置換します。すべての出現箇所を検索・置換するには g をオンにしてください。
壊滅的なバックトラッキングとは何ですか?
(a+)+ のように入れ子や重なりのある量指定子を持つパターンにより、ほぼマッチする入力に対してエンジンが指数関数的な数の経路を試してしまうことです。このテスターは、ページを固まらせる代わりに、時間制限を超えた実行を停止します。
メールアドレスに適した正規表現は?
実用的なパターンは [A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,} で、ライブラリに収録されています。メールの規格を完全に実装した正規表現はないので、アドレスを本当に確認する唯一の方法は確認メールを送ることです。
テストデータはどこかに送信されますか?
いいえ。マッチング、置換、解説はすべてブラウザ内で行われるので、ログや顧客データに対しても安心してパターンをテストできます。