正規表現テスター
正規表現をその場で検証。マッチとキャプチャ群の確認、置換のプレビュー、分割まで JavaScript の意味論で。
パターンとテキストを入力すると結果が表示されます
このツールの役割
正規表現はテキストのパターンを記述するコンパクトな言語で、それを確実に書く唯一の方法は、実際のテキストに対して動かして見ることです。このテスターはそれを 3 つのモードでライブに行います。一致は、パターンが一致するすべての場所をテキスト中に強調表示し、各キャプチャグループをその下に一覧します。置換は、$1 や lt;name> の参照を含め、String.replace が生むものをプレビューします。分割は、String.split がテキストをどう切り分けるかを — 出力に現れるキャプチャされた区切り文字のような、人が正しく予測しにくい部分も含めて — 表示します。
パターンはお使いのブラウザ自身の JavaScript エンジンで動きます。その模倣ではありません。ここで一致するものは、あなたの JavaScript コードで一致するものと 1 バイトまで正確に同じです。仕事をするのが同じエンジンだからです。
一致結果の読み方
すべての一致はテキスト中に強調表示され、その位置 — 始まりと終わりの文字オフセット — とともにその下に一覧されます。パターンがキャプチャグループを含むなら、各グループがその一致の下に、キャプチャした値とともに現れます。グループは開き括弧で左から右へ番号付けされ、まさにエンジンが $1・$2 や後方参照のために番号付けるとおりです。名前付きグループは番号の横に名前を示します。一致に加わらなかったグループ — 例えば選択の負けた側 — は、空文字列としてではなくそのように印付けされます。あなたのコードにとってそれらは別物だからです: undefined か "" か、です。
パターンは正当にゼロ文字に一致しえます — ^、\b、空の選択肢はどれもそうなりえます。そうしたゼロ長の一致は何も強調しないので、このツールはその位置を細い線で印付けし、一致がどこへ行ったのか迷わせません。
フラグ
フラグはパターン全体の振る舞いを変え、そのうち 2 つがほとんどの正規表現の混乱を引き起こします:
- g (グローバル) — 最初だけでなくすべての一致を見つけます。これがないと、一致は 1 件だけを表示し、置換は 1 か所だけを変えます。人が最もよく忘れるフラグです。
- i (大文字小文字を無視) — 文字が大小を問わず一致します。
- m (複数行) — ^ と $ が、テキスト全体だけでなくすべての行の始まりと終わりに一致します。
- s (dotAll) — ドットが改行文字にも一致します。これがないと . はすべての改行で止まります。
- u (Unicode) — パターンがコードポイントで動くので、絵文字や基本範囲外のほかの文字が正しく振る舞い、\p{…} プロパティエスケープが使えるようになります。
- y (スティッキー) — 一致は前の一致が終わったちょうどその位置から始まらなければなりません。トークナイザーに有用で、それ以外では意外です。
- d (インデックス) — エンジンが各グループの正確な位置を記録します。何が一致するかは変えません。
置換の参照
置換テキストは文字どおりには取られません — わずかな $ の並びが一致ごとに展開されます。$1 から $9 は番号付きグループがキャプチャしたものを、lt;name> は名前付きグループを、amp; は一致全体を挿入し、$ は文字どおりのドル記号を生みます。それ以外はすべてそのままコピーされます。
"2026-07-20".replace(/(?<y>\d{4})-(\d{2})-(\d{2})/, "$3.$2.lt;y>")
// → "20.07.2026"身につける価値のある JavaScript の挙動が一つ: g フラグがないと、置換は最初の 1 か所だけを変えます。これはこのツールの癖ではなく — あなたのコードがそうするのです。このツールは g がオフのときヒントを示すので、単一の置換がバグに読めないようにします。
分割の本当の振る舞い
正規表現による String.split には、経験豊富な開発者でも定期的に驚かせる 2 つの振る舞いがあり、分割モードは主にそれらを見えるようにするために存在します。第一に、パターンがキャプチャグループを含むと、それがキャプチャするものが断片の間で出力配列に織り込まれます — "a,b" を (,) で分割すると 3 つの部分になります: a、カンマ、b です。第二に、テキストのまさに始まりや終わりでの一致、あるいは隣り合う 2 つの一致は、出力に空文字列を生み、このツールはそれを隠さず明示的に示します。
"a,b".split(/(,)/) // → ["a", ",", "b"] ",a,".split(/,/) // → ["", "a", ""]
暴走するパターンは、耐えるのではなく止める
一部のパターンは罠です。(a+)+ のような入れ子の量指定子を、ほとんど一致する長い文字列に対して試すと、エンジンは諦める前に指数関数的に多くの組み合わせを再試行させられます — これは破滅的なバックトラックと呼ばれ、ブラウザのタブを何分も凍らせることがあります。このツールはパターンを別のワーカースレッドで動かし、2 秒後に止めるので、暴走するパターンは凍ったページではなくメッセージ 1 つで済みます。そのメッセージに出会ったら、パターンの中の入れ子の量指定子や重なり合う選択肢を探してください。直し方はたいてい、内側の繰り返しと外側の繰り返しが同じテキストに一致できないようにすることです。
このサイトのすべてのツールと同じく、パターンもテキストも端末の外に出ることはありません — ワーカーはサーバーではなくページの一部です。
よくある質問
- このテスターはどの正規表現の系統を使いますか?
- JavaScript (ECMAScript) です。パターンがブラウザ自身のエンジンで動くからです。名前付きグループ、後読み、\p{…} Unicode プロパティエスケープはすべて現代の JavaScript と同じく動きます。PCRE や Python のパターンはたいてい引き継げますが、JavaScript にない構文 — 強欲な量指定子、原子グループ、\A、\z — は拒否されるか別の意味になります。
- 私のパターンが 1 件しか見つけないのはなぜですか?
- ほぼ常に: g フラグがオフです。これがないと JavaScript は最初の一致で止まり、置換は最初の 1 か所だけを変えます。g のチェックボックスをオンにしてテキスト全体を検索してください。
- グループの「関与しませんでした」とはどういう意味ですか?
- グループはパターンに存在するが、この特定の一致では使われなかった — たいていは負けた選択の枝にあるか、0 回一致した量指定子の下にあるためです。コード上その値は undefined で、空文字列をキャプチャするのとは異なるので、このツールは両者を区別して保ちます。
- 私のパターンやテキストはサーバーに送られますか?
- いいえ。一致は完全にブラウザ内、同じページのワーカースレッドの中で動きます。2 秒の安全タイムアウトもローカルで課されます — 入力した内容が端末の外に出ることはありません。