メインコンテンツへスキップ
Tooletto

正規表現テスター

JavaScriptの正規表現をサンプルテキストに対してテストし、ライブハイライト、キャプチャグループ、名前付きグループ、置換プレビュー付きです。完全にブラウザ内で動作します。

  • ファイルは端末の外に出ません
  • 無料、登録不要
  • 透かしなし
  • 一度読み込めばオフラインでも動作します
Loading tool…

正規表現テスターの使い方

  1. 1

    パターンを入力

    式を入力し、必要なフラグを選びます。

  2. 2

    テストテキストを追加

    入力中にマッチがハイライトされ、各キャプチャグループが一覧表示されます。

  3. 3

    置換をテスト

    置換タブは$1スタイルの参照を使って結果をプレビューします。

ライブハイライトが頭の中でパターンを読むより優れている理由

正規表現は実際のテキストに対して頭の中で追跡するのが本当に難しいものです — `(\d{3})-(\d{2})-(\d{4})`のようなパターンは抽象的な記述としては十分読みやすいですが、それが特定のサンプルテキストブロックに対して、想定される部分文字列だけに正確にマッチすることを確認するのは、パターンを読んで推論することとは異なる種類のチェックです。パターンを入力しながらサンプルテキスト上で直接各マッチをハイライトすることは、その抽象的な推論を、頭の中でのシミュレーションを必要としない具体的で即座の視覚的確認に変えます — マッチは期待した場所に現れるか現れないかのどちらかです。

これは先読み、後読み、または非貪欲量指定子を使うものにとって特に価値があります。そこでは実際のマッチ境界は、パターンを読むだけで誰かが推測するものとは頻繁に異なります。マッチがどこで始まりどこで終わるかを、想定するのではなく実際に見ることで、バリデーション関数の中に公開された後ではなく、その場で1つ多い/少ない境界エラーを検出できます。

JavaScriptの正規表現はPCREやPythonのreと同じ言語ではない

正規表現の構文は言語間で広く似ているように見えますが、サポートされる具体的な機能は、パターンが基本を超えた何かを使う段階になると重要な形で異なります。JavaScriptには所有量指定子とアトミックグループがどちらもありません。これらはPCRE(PHPや多くの他のツールが使用)に、特定のバックトラックパターンを明示的に防ぐ手段として存在します。後読みアサーションは今はJavaScriptでサポートされていますが、先読みよりかなり後に登場し、古いバージョンのブラウザでは利用できませんでした。これは古いブラウザで実行する必要があるコードにとって今も時々重要です。そしてJavaScriptのパターン内の`\d`は、パターンが`u`(Unicode)フラグも持たない限りASCIIの数字0〜9にのみマッチします。これは他の言語の正規表現エンジンでUnicode対応の数字クラスと同じ挙動をすると想定する誰にとっても驚きです。Pythonやシェルツールのために書かれた例をコピーするのではなく、特にJavaScript向けのパターンをテストすることが、このツールが構築されている理由の核心です。

破滅的バックトラック、そしてテスターに時間予算がある理由

特定の正規表現パターン — 最もよくあるのは`(a+)+b`のようなネストされた量指定子を持つもの — は病的な性質を持ちます: 最終的にマッチしない長い文字列に対して、エンジンは諦める前に指数関数的に増加する数のバックトラック方法を探索します。マッチしない10文字の文字列に対して瞬時に結果を返すパターンでも、50文字の文字列に対しては宇宙の年齢より長くかかることがあります。これは誇張ではなく指数関数的成長の文字通りの数学的挙動です。これは本番システムにおける本物の悪用可能な脆弱性のクラスです — ReDoS、つまり正規表現サービス拒否です。脆弱なパターンへの入力文字列を制御できる攻撃者は、たった1つのリクエストでサーバープロセスを無期限にハングさせることができます。

このツールは、この性質を持つパターンがブラウザタブ全体ではなくテストセッションを固まらせるようにするために、特に短い時間予算の後で評価を中断します。その中断に到達すること自体が有用な情報です: それは、パターンがおそらくまさにこの脆弱性を持っており、再構築が必要であることを意味します — 典型的には、指数的バックトラックを引き起こす曖昧さがそもそも生じないよう、内側の量指定子をより具体的にすることによってです。

よくある質問

これはどの正規表現の方言ですか?

JavaScript(ECMAScript)です。これはあなたのブラウザで実行されるものです。PCREやPythonとはいくつかの点で異なります — 非常に古いブラウザでは後読みがない、所有量指定子やアトミックグループがない、`u`フラグを使わない限り`\d`はASCII数字にのみマッチします。

グローバルフラグは実際に何を変えますか?

`g`がなければ最初のマッチだけが見つかります。あれば、すべてのマッチが返されます — これは文書全体でハイライトや置換をするときに欲しいものです。このツールはどのみちすべてのマッチを表示しますが、フラグは`replace`の挙動にはまだ影響します。

なぜパターンがタイムアウトしたのですか?

一部のパターンは破滅的にバックトラックします — `(a+)+b`のようなネストされた量指定子は、マッチしない文字列に対して指数時間かかることがあります。ツールはタブを固まらせる代わりに短い時間予算の後で中断します。発生した場合、修正はほぼ常に内側の量指定子をより具体的にすることです。

置換でキャプチャグループをどう使いますか?

`$1`、`$2`などとして参照するか、`(?<name>…)`と書かれた名前付きグループには`$<name>`を使います。マッチ全体には`$&`を、リテラルのドル記号には`$$`を使います。