正規表現テスターについて
正規表現(regex)は、「4桁の数字、ハイフン、2桁の数字」のようなテキストのパターンを表すもので、コード、エディタ、コマンドラインツール、表計算ソフトでテキストの検索、検証、書き換えに使われます。一致箇所をすぐに確認できれば、意図したとおりに一致するパターンをずっと簡単に作れます。
このテスターはブラウザに組み込まれたJavaScriptの正規表現エンジンを使うため、JavaScriptやNode.jsのRegExp、match、replaceと同じ結果になります。入力に合わせて一致箇所が強調表示され、すべての一致が位置とキャプチャグループとともに一覧表示されます。置換モードでは、置換文字列による結果を確認できます。
パターンは時間制限付きのバックグラウンドワーカーで実行されるため、壊滅的なバックトラックを起こすパターンでもページが固まることはありません。パターンとテキストはブラウザの外に出ません。
使い方
- 「正規表現」欄に、前後のスラッシュを付けずにパターンを入力します。「例:」にある例をクリックしてもかまいません。
- 「フラグ」のg、i、m、s、u、yをオン・オフします。ブラウザが対応していれば、dとvも使えます。
- 検索対象のテキストを「テスト用テキスト」に貼り付けます。一致箇所は「一致箇所の強調表示」で示され、「一致の詳細」にインデックス、長さ、グループとともに一覧表示されます。
- 「モード」で「置換」を選び、$<day>/$<month>/$<year> のような「置換文字列」を入力すると「置換後の結果」が表示されます。「結果をコピー」でコピーできます。
- 構文はテスターの下にある「チートシート」で確認できます。「クリア」で最初からやり直せます。
主な機能
- リアルタイムの強調表示と一致の詳細: すべての一致をテキスト内で強調表示し、インデックス、長さ、番号付きと名前付きのキャプチャグループとともに一覧表示します。空(長さ0)の一致は細いマーカーで示し、dフラグを付ければ各グループの開始位置と終了位置も含めます。
- 置換のプレビュー: JavaScriptの構文で置換を試せます。グループには$1と$<name>、一致全体には$&、一致の前後のテキストには$`と$'、ドル記号そのものには$$を使います。
- 本物のJavaScriptエンジン: 照合にはブラウザのRegExpの実装を使うため、動作も構文エラーも、お使いのJavaScriptコードで起きるものとまったく同じです。
- 暴走するパターンからの保護: 各実行はWeb Workerで行われ、1.5秒で停止します。タブが固まる代わりに、壊滅的なバックトラックについての説明が表示されます。
- 例とチートシート: メールアドレス風のテキスト、ISO形式の日付、16進数のカラーコード、繰り返された単語のシンプルなパターンを読み込めます。よく使うトークンや置換コードもひと目で確認できます。
使用例
日付の書式を変える
ISO形式の日付の例を読み込んで置換に切り替えます。このパターンは年、月、日を名前付きグループとして取り出し、置換文字列 $<day>/$<month>/$<year> が2024-03-15を15/03/2024に変えます。
重複した単語を見つける
パターン \b(\w+)\s+\1\b にiフラグを付けると、繰り返された単語が次の行に続いていても、"is is"や"the the"を見つけます。$1で置換すると重複が取り除かれます。
CSSから色を抜き出す
#(?:[0-9a-f]{6}|[0-9a-f]{3})\b にgとiのフラグを付けると、スタイルシート内の3桁と6桁のカラーコードがすべて一致の一覧に表示され、#12345Gのような無効な値は除外されます。
遅いパターンを診断する
「遅いパターン(デモ)」の例 ^(a+)+$ は、長く続く"a"の後に"b"が来るテキストに対して実行すると、1.5秒で停止して警告が表示されます。原因は入れ子になった+で、^a+$なら同じテキストに一瞬で一致します。
制限事項と注意点
- 対応しているのはJavaScriptの正規表現構文だけです。強欲な量指定子、アトミックグループ、再帰、\Aや\Zなど、ほかの方言の機能は使えません。使える構文の詳細はブラウザによって異なります。
- テスト用テキストは200,000文字までです。一覧表示と強調表示は5,000件の一致までですが、一致数と置換モードはすべての一致を対象にします。
- 各実行は1.5秒で停止します。そのため、正当でも非常に重いパターンを長いテキストに使うと、停止されることがあります。
- JavaScriptと同じく、gフラグがない場合は最初の一致だけが検索・置換されます。
- 例のパターンは、学習や簡単な検索のために意図的にシンプルにしてあります。完全な検証用ではなく、たとえば日付の例は2024-02-30も受け付けます。
- インデックスと長さはJavaScriptと同じくUTF-16のコード単位で数えるため、絵文字は2文字として数えられます。
よくある質問
このテスターはどの正規表現の方言を使っていますか?
ブラウザのエンジンで実行されるJavaScript(ECMAScript)の正規表現です。ここで動くパターンは、JavaScriptやNode.jsのコードでも同じように動きます。Python、PCRE(PHP)、Javaのパターンは似ていることが多いものの、後読みの対応、インラインフラグ、名前付きグループの構文などの細部が異なります。
パターンが1つしか一致しないのはなぜですか?
g(global)フラグをオンにしてください。gがないと、JavaScriptは検索でも置換でも最初の一致で止まります。
壊滅的なバックトラックとは何ですか?
(a+)+ や (\w|\d)* のように量指定子が入れ子になっていたり重なり合っていたりするパターンは、ほぼ一致するテキストに対して、指数関数的な数の一致方法を試すことがあります。するとエンジンが何分も動き続けることがあります。たいていは、^(a+)+$の代わりに^a+$を使うなど、パターンをより具体的にすれば解決します。
キャプチャしたグループを置換で使うにはどうすればよいですか?
番号付きグループには$1、$2などと書き、(?<name>…)と書いたグループには$<name>と書きます。$&は一致全体を、$$はドル記号そのものを挿入します。
スラッシュはエスケープする必要がありますか?
このテスターでは必要ありません。欄の前後のスラッシュは飾りで、パターンはそのままnew RegExp()に渡されます。/a\/b/ のようなJavaScriptの正規表現リテラルの中では、スラッシュをエスケープする必要があります。
テキストはサーバーに送信されますか?
いいえ。照合はこのページ内のWeb Workerで行われ、パターンもテキストもネットワークに送信されません。