ハウツー
何もインストールせずに正規表現を試す方法
パターンを書いたものの、コードに組み込む前に、それが本当に期待どおりに一致するかを確かめたいことがあります。デスクトップツールをインストールしたり、非公開のログをどこかのサイトに貼り付けたりするのは大げさで、しばしば危険でもあります。このガイドでは、ブラウザ内で自分のテキストに対して正規表現を直接実行し、動作を変えるフラグを切り替え、取り出されたキャプチャグループを読み、一致箇所がインラインでハイライトされる様子を見る方法を、パターンもテキストもタブから一切外に出すことなく紹介します。
手順
- 正規表現テスターを開き、2本のスラッシュの間のフィールドにパターンを入力します。スラッシュ自体は入力しません。ツールがそれを表示するので、エンジンが読み取るとおりにパターンを確認できます。下のボックスにサンプルテキストを貼り付けます。たとえば数行のログ、メールアドレスのリスト、または検索したいコードのかたまりなどです。

- パターンの隣の小さなボックスでフラグを設定します。g フラグは最初で止まらずすべての一致を見つけます。i は大文字と小文字を区別しない一致にします。m はアンカー ^ と $ がテキスト全体ではなく各行の先頭と末尾に一致するようにします。s はドットが改行にも一致するようにします。たとえば gim のように自由に組み合わせてください。
- テストを押します。各一致はテキスト内に直接ハイライトされ、下のリストにはすべての一致がその位置と各キャプチャグループの値とともに表示されます。パターンを調整して再実行すれば、プレビューが更新され、意図したものだけを正確に捉え、それ以外を捉えなくなるまでパターンを絞り込めます。

キャプチャグループ、名前付きと番号付き
キャプチャグループとはパターンのうち丸かっこで囲んだ部分のことで、全体が一致したかを確認するだけでなく、各一致から一部分を取り出すための仕組みです。番号付きグループは開きかっこの位置によって左から右へ数えられます。(\d{4})-(\d{2})-(\d{2}) ではグループ1が年、グループ2が月、グループ3が日です。名前付きグループは (?<name>...) という構文を使うので、パターンが長くなったとき (?<year>\d{4}) はただの番号よりはるかに読みやすくなります。捕捉せずにグループ化だけしたい場合、たとえば複数の文字に量指定子を適用したいときは、結果リストを混雑させないよう非キャプチャグループ (?:...) を使います。テスターは各一致についてすべてのグループの値を表示するので、正しい部分を取り出せているかを確認する最速の方法になります。
パターンがフリーズしたり誤動作したりするとき
繰り返し起きる問題が2つあります。1つ目は破滅的バックトラッキングです。長く一致しない文字列に対して (a+)+$ のようなパターンを実行すると、エンジンが指数関数的な数の経路を試みてフリーズしてしまうことがあります。テスターは各テストを短い監視タイマー付きの Web Worker 内で実行するので、固まったタブの代わりに明確なメッセージが表示され、パターンを単純化できます。たいていは量指定子を実質的に所有的にする、アンカーを付ける、入れ子の繰り返しを避ける、といった方法です。2つ目は貪欲な一致と控えめな一致の違いです。既定では .* は可能なかぎり多くを取り込むので、1つの HTML タグの中身に一致させたいときは代わりに控えめな形 .*? を使います。パターンが何を狙うべきかを見るために、わずかに異なる2つの文字列を比べるなら、テキスト差分ツールがそれらを並べてくれるので、式を書く前に違いがはっきり分かります。
ブラウザが正規表現を評価する方法
現代のブラウザにはECMAScript正規表現エンジンが組み込まれており、完全なフラグセットをサポートします。大文字小文字を区別しない一致(i)、マルチラインモード(m)、dotAll(s)、Unicode(u)、スティッキーフラグ(y)です。テスターにパターンを入力すると、エンジンはそれを内部のNFAにコンパイルしてリアルタイムでテスト文字列に対して評価し、すべての一致位置とキャプチャグループを報告します。バックトラッキングはCPU上でローカルに行われます。(a+)+のようなパターンを長い不一致文字列に適用すると数秒間スピンする可能性があり、本番コードにパターンをデプロイする前にブラウザでその停止を見ることは有用なフィードバックです。テキストはページから外に出ないため、ログのサンプルや任意の入力をサードパーティサーバーを経由させることなく貼り付けられます。
このガイドで使うツール
よくある質問
私のパターンやテスト用テキストはサーバーに送信されますか?
いいえ。正規表現はあなた自身のブラウザ内の Web Worker で実行されるため、パターンと試すテキストはタブの中にとどまります。貼り付けるテキストは実際のログ、顧客リスト、社内設定など、まさに他人のサーバーに置きたくない種類のデータであることが多いので、これは重要です。テストを押すときに開発者ツールのネットワークパネルを開いても、あなたのテキストを外へ運ぶリクエストは1つも見当たりません。ページを読み込んだ後はオフラインでも動作し続けます。
テスターはどの正規表現の方言を使いますか?
ブラウザに組み込まれた JavaScript の正規表現エンジンを使います。これは Node.js やあらゆるウェブページで動くものと同じです。文字クラス、量指定子、アンカー、選択、番号付きおよび名前付きキャプチャグループ、先読みと後読みといった一般的な構文を網羅します。Perl 風の再帰や所有的量指定子など、他の方言にある一部の機能は JavaScript エンジンには含まれていません。そのため PHP や Python のプロジェクトからコピーしたパターンが違う動きをする場合、その方言の違いが原因であることがほとんどです。