このツールでできること
PCRE 正規表現テスターは、PHP や Perl 系のツール、多くのウェブサーバーと同じエンジンである本物の PCRE2 ライブラリを使って、正規表現をテキストに対してテストします。マッチはハイライト表示され、各マッチの位置とキャプチャグループが一覧表示されます。置換文字列を指定すれば、preg_replace 形式の置換結果も確認できます。
本物のエンジンでテストすることには意味があります。PCRE と JavaScript の正規表現には、小さいながらも重要な違いがあるからです。ブラウザベースのテスターでは動くパターンが、PHP ではコンパイルに失敗したり、違うものにマッチしたりすることがあります。
使い方
- PCRE パターン(デリミタなし) にデリミタを付けずにパターンを入力します。
- 検索対象のテキストを テスト文字列 に貼り付けます。
- 必要な修飾子をオンにします。すべてのマッチを取得する g(preg_match_all 相当)、i、m、s、x、U、そして
\w・\d・\bを Unicode 対応にする u があります。 - 必要に応じて 置換文字列($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 モジュールを一度ダウンロードするだけで、処理はすべてブラウザ内で行われます。