正規表現テスター
自分のテキストに対して、正規表現をリアルタイムで作成・テストできます。ハイライトされたすべてのマッチをひと目で確認し、キャプチャグループを調べ、置換結果をプレビューできます。すべてブラウザ内で完結します。
/
/g
フラグ
ヒント:g フラグを有効にすると、最初のマッチだけでなくすべてのマッチが置換されます。
正規表現テスター の使い方
- 1
パターンを書く
パターン入力欄に正規表現を入力し、フラグチップ(g、i、m など)を切り替えて、マッチの動作を思いどおりに制御します。
- 2
テスト用テキストを追加する
検索したいテキストを「テスト文字列」ボックスに貼り付けます。パターンを入力・編集すると同時に、マッチがハイライトされます。
- 3
マッチを確認する
結果一覧で、各マッチとテキスト内での位置、キャプチャグループや名前付きグループを確認し、パターンが意図どおりに動作しているかチェックします。
- 4
置換またはコピーする
置換後のテキストを入力すると、$1 形式の後方参照を使った置換結果をプレビューでき、その結果をコードやドキュメントにそのままコピーできます。
実践・正規表現——開発者のためのフィールドガイド
正規表現が本当に記述しているもの
正規表現は、文字列の集合を記述するための小さなパターン言語です。テキストが固定の値と等しいかどうかを問う代わりに、その「形」——数字の並び、単語に続くアットマークとドメイン、3文字の英字のあとにダッシュ——を記述すると、エンジンがテキストを走査して、その形に合うすべての部分文字列を見つけ出します。このたった1つの考え方が、ほぼすべての言語やエディタで、入力値の検証、検索と置換、ログの解析、トークン化、データ抽出を支えています。
このテスターは、ブラウザに組み込まれた JavaScript(ECMAScript)エンジンを使います。これは Node.js やウェブアプリが使うのと同じものです。そのため、ここでマッチするパターンは、あなたのアプリケーションコードでもまったく同じように動作します。プロジェクトに貼り付ける前にパターンを作成・デバッグするための、忠実なサンドボックスになるわけです。
文字クラスと基本部品
パターンの大部分は、それ自身にマッチするただのリテラル文字で、そこにひと握りの特殊なトークンが点在しているだけです。角括弧で囲んだ文字クラスは、集合の中の任意の1文字にマッチします——小文字の範囲、母音の集合、あるいは数字といった具合です。短縮表記の \d は数字に、\w は単語構成文字(英字・数字・アンダースコア)に、\s は空白文字にマッチし、ドット . は改行を除く任意の1文字にマッチします。短縮表記を大文字にすると意味が反転し、\D は数字以外の任意の文字を表します。
これらは、他のあらゆるものを組み立てるための原子です。たとえば16進カラーコードのパターンは、ハッシュ記号にアンカーを置き、それに続けて16進数字の文字クラスを繰り返したものになります。単語のパターンは、単純に \w を1回以上繰り返したものです。1つの巨大な式に頼るのではなく、こうした小さな部品からパターンを組み立てましょう。
アンカー、量指定子、選択
アンカーは、文字ではなく位置にマッチします。キャレット ^ は文字列の先頭(multiline フラグを付ければ行の先頭)にマッチし、ドル記号 $ は末尾にマッチします。単語境界トークンの \b は、単語構成文字と非単語構成文字の境目にマッチし、これによって、ある単語をより長い語の内部で拾ってしまうことなく、単語まるごとにマッチさせられます。量指定子は繰り返しを制御します。プラス記号 + は1回以上、アスタリスク * は0回以上、疑問符 ? は省略可能を意味します。たとえば2〜4回繰り返す値が必要なときは、波括弧を使った記法で正確な回数や範囲を指定することもできます。
パイプ記号 | による選択は「または」を意味します——cat|dog というパターンはどちらの単語にもマッチします。選択肢を丸括弧で囲めば、その選択の範囲を限定できます。量指定子は既定では貪欲(greedy)で、できるだけ多くを取り込もうとします。量指定子のあとに疑問符を付けると怠惰(lazy)になり、できるだけ少なくマッチするようになります。これは、1つのタグを取り込むはずのパターンが、その行の最後のタグまで何もかも飲み込んでしまうときの、定番の対処法です。
キャプチャグループとその使い方
丸括弧は二役を担います。パターンの一部をグループ化すると同時に、その部分がマッチした内容をキャプチャするのです。マッチのあと、キャプチャされた断片は番号付きグループとして利用できます——最初の丸括弧がグループ1、次がグループ2、という具合です。このツールの結果一覧には各グループが表示されるので、意図したとおりの断片を取り出せているかを確認できます。ローカル部・ドメイン・拡張子のそれぞれを別々の丸括弧で囲んだメールアドレス風のパターンなら、その3つの部分を個別に読み取れます。
名前付きグループは、開き丸括弧の直後に山括弧で名前を置く構文で書き、これらのキャプチャに、ただの番号ではなく読みやすいラベルを与え、専用のセクションに表示されます。キャプチャのオーバーヘッドなしにグループ化だけがしたいときは、非キャプチャグループ——開き丸括弧に続けて疑問符とコロンを置いたもの——を使えば、グループ番号をすっきり保てます。これらのキャプチャは、置換のステップが参照する対象でもあります。
フラグはマッチ全体を変える
フラグは、パターン全体の適用のされ方を変える修飾子です。Global は最初のマッチで止まらずにすべてのマッチを見つけ、これは1か所だけでなくすべての出現箇所を置換するために不可欠です。Ignore-case は、大文字・小文字にかかわらず英字をマッチさせます。Multiline は、キャレットとドルのアンカーを、入力全体の先頭と末尾だけでなく、各改行位置でマッチするように定義し直します。
残りのフラグは状況次第ですが重要です。Dotall はドットを改行文字にもマッチさせるので、パターンが複数行にまたがれるようになります。Unicode は、基本範囲を超えるコードポイントや Unicode プロパティエスケープのために、完全な Unicode 処理を有効にします。Sticky は、各マッチを直前のマッチの直後の位置に固定し、これがトークナイザーが先へ飛ばさずに入力をたどっていく仕組みです。ここでフラグを切り替え、ハイライトされたマッチがどう変わるかを見ながら、それぞれの感覚をつかんでください。
何度も書くことになるパターン
いくつかの形は、何度も繰り返し登場します。テキストの塊からすべての整数を抜き出すのは、\d を1回以上繰り返し、global フラグを付けたものです。大ざっぱなメールアドレスのチェックは、1文字以上の単語構成文字、アットマーク、1文字以上の単語構成文字、リテラルのドット、そして短い英字の連なり——手早い妥当性フィルターには十分ですが、あえて緩く作ってあります。空白の連なりを取り除いたり1つにまとめたり、小文字とダッシュからなるスラッグを検証したり、2つの目印の間にある内容を抽出したりするのは、いずれも日常的な仕事です。
本当に複雑な形式を、1つの怪物のようなパターンで検証しようとする誘惑には抗いましょう。とりわけメールアドレスや URL の文法は、正規表現で完全に捉えるのが難しいことで知られています。そうしたものには、緩いパターンに本物のパーサーや専用ライブラリを組み合わせるほうが、半年後には触るのが怖くなるような読めない式よりも、たいてい優れています。
破滅的バックトラッキングとその回避法
エンジンのバックトラッキングは正規表現を強力にしている当のものですが、同時にパターンを爆発させる原因にもなります。パターンの中の量指定された2つの部分が、同じ文字に何通りも重なり合う形でマッチできるとき——典型例は、それ自体が繰り返されるグループで、内側と外側の繰り返しが競合する場合です——エンジンは、最終的にはマッチに失敗する文字列に対して、天文学的な数の組み合わせを試すことがあります。長い入力では、これが数秒間固まったり、完全にハングしたりすることもあり、サーバー上では ReDoS として知られるサービス拒否攻撃の手口になります。
防御策は構造的なものです。同じものにマッチしうる量指定子を、別の量指定子の内側に入れ子にするのを避け、寛容なドットよりも具体的な文字クラスを選んで、各ステップが入力を消費する方法を1通りだけにし、可能なときはパターンにアンカーを付けましょう。危険なパターンをどうしてもテストする必要があるなら、まずここで現実的な最悪ケースの文字列に対して試してください。暴走したパターンの代償が、本番障害ではなくブラウザのタブ1枚で済みます。
置換を安全にプレビューする
検索と置換は、正規表現が日々その真価を発揮する場面であり、置換欄を使えば、どこかに確定させる前に結果をプレビューできます。置換テキストの中では、ドル記号とグループ番号でキャプチャグループを参照します——$1 は最初のグループがマッチした内容に置き換わります——ので、日付を並べ替えたり、名前の書式を整え直したり、マッチをマークアップで囲んだりできます。global フラグがなければ最初のマッチしか置換されないことを忘れないでください。すべての出現箇所を変換するには global を有効にします。
すべてはブラウザ標準のエンジンを使ってブラウザ内でローカルに実行されるため、貼り付けた内容——ログ行、ソースコード、顧客データ——がアップロード・記録・保存されることはありません。だからこそこのテスターは、マッチと置換出力の両方が完全に正しくなるまで、実際のサンプルで試行錯誤するのに安全な場所であり、仕上がったパターンを自信を持って自分のコードにコピーできます。
よくある質問
正規表現とは何ですか?
このテスターはどの正規表現エンジンを使いますか?
各フラグはどんな意味ですか?
キャプチャグループはどのように機能しますか?
入力したデータはサーバーに送信されますか?
関連ツール
こちらの便利なツールもどうぞ