正規表現テスター
開発JavaScript の正規表現を、一致のハイライトとキャプチャグループ付きで検証します。
このページの内容
正規表現テスターとは?#
正規表現は、テキスト内のパターンを記述するコンパクトな記法です。「メールアドレスらしいものすべて」「各行の 3 番目の単語」「引用符の内側にないすべての数字」。パターンを書くのは仕事の半分で、もう半分は、本番コードに貼り付ける前に、それが実際に何に一致するかを自分のテキストに似たデータで確認することです。正規表現テスターはその作業をするページです。
本ツールはパターンをサンプルテキストに対してリアルタイムで実行し、一致箇所をすべてその場でハイライトし、各キャプチャグループを個別にリストします。これにより、一致したかだけでなく何をキャプチャしたかを確認できます。JavaScript の正規表現エンジン(ブラウザと Node がすでに話しているのと同じ)を使うため、ここでの挙動はコードが実際にすることと一致します。
使い方#
- 左上の 2 つの
/マーカーの間にパターンを入力します。スラッシュ自身は入力しません — コードでリテラルの正規表現を書くように、描画されています。 - パターン右の小さなボックスにフラグを入力します。最もよく使うのは次の通り。
g— 最初の 1 つだけでなく、すべての一致を検索。i— 大文字小文字を区別しない。m—^と$が文字列全体ではなく各行の先頭と末尾に一致。s—.が改行にも一致するようにする。u— パターンを Unicode として扱う(絵文字や非 ASCII で重要)。
- 下のボックスにテストテキストを貼り付けます。実際の入力に似たテキストを使ってください — きれいな例で動くパターンは、乱雑なデータではしばしば誤動作します。
- 右のハイライト付きプレビューを読みます。すべての一致が文脈の中にその場で表示されます。その下に、各キャプチャグループがインデックス、キャプチャテキスト、見つかった位置とともに 1 行ずつリストされます。
主な機能#
- ライブハイライト。 すべての一致が元のテキストに対してその場で描画されるため、境界が一目で分かります — 空白をまたぐ一致の厄介なケースも含みます。
- グループごとのキャプチャリスト。 グループインデックス、一致部分文字列、文字オフセットがキャプチャごとに 1 行。パターンが 3〜4 のグループを持つとき、どれがどれかを知る必要がある場合に不可欠です。
- 複数フラグの同時使用。
g、i、m、s、uを自由に組み合わせられます(例:giuでグローバル、大文字小文字区別なし、Unicode 対応)。 - ReDoS の事前警告。 一部のパターン — 典型的には
(a+)+のような入れ子の量指定子 — は、細工された入力に対し指数関数的に爆発し得ます。ステータス行は、そのようなパターンが一致した瞬間にパターン自身をフラグし、敵対的入力に出会う前に単純化を促します。このチェックはパターンの形状を読みます。最後の実行がどれだけかかったかを測るものではなく、本当に破滅的なパターンはタブをロックできるため、警告に注意してください。 - 設計上の上限。 入力は 250,000 文字に制限され、一致リストは数千件を超えると成長を止めます(キャプチャパネルは最初の 200 を表示)。そのため、巨大なファイルの誤貼り付けが静かに永遠に走ることはありません。
- ラウンドトリップなし。 パターンとテキストはブラウザ内で処理され、どこにも送信されません。
実例#
ログ行のリストがあり、HTTP 動詞で始まる行からメソッドとパスを取り出したいとします。このパターンを使います。
(\w+)\s+(/[\w/-]+)
フラグ gm で、次に対してテストします。
GET /api/users
POST /api/login
DELETE /api/users/42
not a log line
PUT /api/items/3-qty
ツールは 1、2、3、5 行目をハイライトします(4 行目は単語の後に続くパスを持たないため)。キャプチャリストは各一致についてメソッドとパスを別々に報告します — したがって DELETE がグループ 1、/api/users/42 がグループ 2 であり、パスグループが最後の行の末尾の -qty セグメントを正しく含むことを確認できます。
よくある質問#
どの正規表現フレーバーを使っていますか?#
JavaScript の組み込みエンジン — String.prototype.match、RegExp.prototype.exec、Node の正規表現リテラルが使うのと同じです。ここで動くパターンは、フロントエンドコードでも Node サーバーでも変更なしで動きます。PCRE、RE2、Rust の正規表現ではありません。PHP や Go のコードベースからパターンをコピーした場合は、頼る前にここでテストしてください。
ツールが ReDoS の可能性を警告します。どういう意味ですか?#
特定のパターンは敵対的入力に対し非常に長い時間走らせることができます — 古典的な例は a の並びの後に b が続かない文字列に対する (a+)+b です。攻撃者はこれを悪用し、正規表現ベースのサービスにサービス拒否を起こします。警告はパターンの形状(入れ子の量指定子、重複する選択)の静的読み取りであり、最後の実行がどれだけかかったかに基づくのではなく、そのようなパターンが一致を生成した瞬間に発火します。見えたなら、パターンを単純化してください — 入れ子の量指定子を外す、アンカーする、またはターゲットエンジンが対応していればアトミックグループを使う。
パターンが一度しか一致しません。なぜですか?#
おそらく g フラグが不足しています。g がないと、JavaScript の正規表現は最初の一致で止まります。重複しないすべての出現を見つけるには g を追加してください。
. は改行に一致しますか?#
デフォルトでは不一致 — . は行終端文字を除く任意の文字に一致します。. に改行をまたがらせたい場合は(改行を含むブロックに一致させるのに便利)s フラグ(「dotall」とも呼ばれる)を追加してください。