正規表現テスター
手元のテキストで正規表現を試せます。一致箇所とキャプチャグループを強調表示し、式の各部分を一つずつ言葉で説明し、JavaScript / PCRE / RE2 の対応の違いも並べて確認できます。計算はすべてブラウザ内で完結します。
Windows デスクトップ版もあります。
このツールについて
正規表現はテキストの形を記述するための小さな言語で、テキストを扱うほとんどの道具がこの言語を話します —— 検索ボックス、ログの絞り込み、コードエディタ、データベース照会。そして「合っているように見えるのに、違うものに一致する」ことでも有名です。解決の近道は、頭で考えることではなく、**答えを先に知っているテキスト**で実際に走らせて、何に一致したかを見ることです。
このページはそれを一か所にまとめました。式を入力し、フラグを選び、テキストを貼れば、一致箇所がその場で強調表示され、各キャプチャグループはテキスト内の位置とともに下に並びます。さらに下では、式が断片ごとに分解され、それぞれが言葉で説明されます —— \b や (?<=…) や最小一致の量指定子が実際に何をしているのか、チートシートを引かずに確認できます。
三つ目の節は、多くのテスターが無視している点を扱います。同じ式でもエンジンによって挙動が同じではありません。ブラウザで問題なく動いた正規表現が、サーバー側の RE2 では受け付けられない、あるいは黙って違う動きをすることがあります。あの表にはエンジン間で**実際に分かれる**機能だけを並べています。手元で動く正規表現が、本番で驚きを生まないために。
計算はすべてお使いの端末で完結します。アップロードの工程も、代わりに照合してくれるサーバーもありません —— 試しているのが顧客データの一行や本番ログの一節であるとき、この点は重要です。
よくある質問
- 式が終わらないのはなぜですか?
- 爆発的にバックトラックする式があるためです。(a+)+$ に長い a の連続を当てるのが典型的な例で、1 文字増えるごとに計算量がほぼ 2 倍になり、40 文字で既に 1 兆ステップです。本ツールは式を別スレッドで実行し、短い制限時間で打ち切るので、ページは固まりません。あのメッセージが出たら原因は式そのものです —— 多くは量指定子の入れ子か、同じテキストに一致しうる量指定子が二つ並んでいることです。
- 貪欲と最小一致は何が違いますか?
- 量指定子は既定で貪欲です。できるだけ多く取り、式の残りが合うまで 1 文字ずつ返します。? を付けると最小一致になり、できるだけ少なく取って、必要になった分だけ広げます。<b>bold</b> に対して、<.+> は文字列全体に、<.+?> は <b> だけに一致します。どちらも正しく、答えている問いが違うだけです。
- \w は日本語やアクセント付きの文字に一致しますか?
- JavaScript では一致しません —— u フラグを立てない限り、\w は ASCII の英数字とアンダースコアだけです。日本語、キリル文字、アクセント付きラテン文字、絵文字はすべて対象外です。あらゆる文字体系の文字を単語構成文字として扱いたいなら、u フラグ付きの \p{L} を使うか、本当に必要な範囲を自分で列挙してください。
- 先読みと後読みは何のためにありますか?
- 「あるものが存在することを要求しつつ、一致結果には含めない」ための仕組みです。「250 dollars」に対して \d+(?= dollars) が一致するのは数字の 250 だけで、dollars という語は含みません。後読みは逆方向に見ます。(?<=\$)\d+ はドル記号の後ろの数字を取り出し、記号そのものは含みません。「これに囲まれているときだけ一致」を表す標準的な手段で、まさに RE2 ができないことです。
- 一致が一つしか返らないのはなぜですか?
- g フラグが入っていないためです。g がないと正規表現は最初の一致で止まります —— JavaScript でも多くの言語でもこれが既定です。g をオンにすれば最後まで探し続けます。検索ボックスから来た場合に全部出ていたのは、そのボックスが代わりに g を立てていたからです。
- 貼り付けたテキストはサーバーに送られますか?
- いいえ。照合はお使いのブラウザ内、お使いのマシン上のワーカースレッドで行われます。入力した内容が送信されたり記録されたりすることはありません。これは意図的な設計です。人が正規表現を試すときの題材は本番ログの一行や顧客データであることが多く、どちらも他人のサーバーに置くべきものではありません。
- sticky フラグ y は何をしますか?
- 次に探す位置を、前回の一致が終わったまさにその位置に固定します。そこから先を自由に検索するのではなく、という意味です。文字列を先頭から順に切り出していき、式が合わなくなった時点で知らせてもらう、という使い方ができます。PCRE にも同じ考え方が \G という名前で存在するので、表では並べて載せています。