DevToolPal
日本語

PCRE 正規表現テスター

本物の PCRE2 エンジンで PHP / Perl 互換の正規表現をテストできます。再帰、強欲な量指定子、\K などに対応。

ローカルで処理、アップロードなし

オプション

テスト文字列

0 文字 · 0 B

結果

結果はここに表示されます

このツールでできること

PCRE 正規表現テスターは、PHP や Perl 系のツール、多くのウェブサーバーと同じエンジンである本物の PCRE2 ライブラリを使って、正規表現をテキストに対してテストします。マッチはハイライト表示され、各マッチの位置とキャプチャグループが一覧表示されます。置換文字列を指定すれば、preg_replace 形式の置換結果も確認できます。

本物のエンジンでテストすることには意味があります。PCRE と JavaScript の正規表現には、小さいながらも重要な違いがあるからです。ブラウザベースのテスターでは動くパターンが、PHP ではコンパイルに失敗したり、違うものにマッチしたりすることがあります。

使い方

  1. PCRE パターン(デリミタなし) にデリミタを付けずにパターンを入力します。
  2. 検索対象のテキストを テスト文字列 に貼り付けます。
  3. 必要な修飾子をオンにします。すべてのマッチを取得する g(preg_match_all 相当)、i、m、s、x、U、そして \w・\d・\b を Unicode 対応にする u があります。
  4. 必要に応じて 置換文字列($1、${name}) を入力すると、置換結果をプレビューできます。番号付きグループには $1 または ${1}、名前付きグループには ${name}、マッチ全体には $0 を使います。

無効なパターンの場合は、PCRE2 自身のエラーメッセージと、パターン中で解析に失敗した位置が表示されます。

例

既定のパターン \((?:[^()]++|(?R))*\) は、対応の取れた丸括弧を見つけます。括弧の中に括弧以外の文字、または再帰的にパターン全体をもう一度含む括弧のペアにマッチします。サンプルテキストでは (a, g(b, c)) と ((x), y) を見つけ、末尾の閉じていない括弧は無視します。JavaScript の正規表現ではこれを表現できません。

(?<amount>\d+(?:\.\d+)?)\s+(?<cur>USD|EUR) を置換文字列 ${cur} $1 で試すと、2 行目の金額と通貨コードが入れ替わります。

知っておきたい PCRE の機能

  • 強欲な量指定子(*+、++、?+)と アトミックグループ((?>...))は、一度マッチした部分を手放さないため、バックトラックの暴走を防げます。
  • \K はマッチの開始位置をリセットします。後読みの手軽な代替手段です。
  • (?R)、(?1)、(?&name) による 再帰 で、入れ子構造にマッチできます。
  • (?i) のような インライン修飾子 で、パターンの一部だけ動作を変えられます。

ヒント

  • PHP ではパターンを /.../ や ~...~ などのデリミタで囲みます。パターン内に現れない文字を選べば、エスケープせずに済みます。
  • アクセント付きの文字や CJK 文字を含むテキストでは u をオンにすると、\w がそれらにマッチするようになります。

よくある質問

› JavaScript の正規表現テスターとは何が違いますか?

このページでは、PHP の preg_ 関数や Nginx、Apache など多くのツールで使われているエンジン PCRE2 を WebAssembly にコンパイルして実行しています。(?R) による再帰、a++ のような強欲な量指定子、アトミックグループ、\K、(?P<name>...) グループ、x 修飾子や U 修飾子など、JavaScript にない構文に対応しています。

› /pattern/i のようにデリミタも入力しますか?

いいえ。パターンだけを入力し、修飾子はチェックボックスでオンにします。PHP の `preg_match('/\d+/i', $s)` は、パターン `\d+` に「大文字小文字を無視」をオンにした状態に相当します。

› 「match limit exceeded」と表示されたのはなぜですか?

長いマッチしない文字列に対する ^(a+)+$ のように、パターンによってはバックトラックが指数関数的に増えます。ページの応答性を保つため、このテスターは 500 万ステップで処理を止めます。PHP にも pcre.backtrack_limit という同様の安全装置があり、上限に達すると preg_match は false を返します。

› テキストはアップロードされますか?

いいえ。PCRE2 の WebAssembly モジュールを一度ダウンロードするだけで、処理はすべてブラウザ内で行われます。