Yueser

正規表現テスト

入力しながらマッチを確認でき、誤りはその場でエラー表示されます。

/ /
フリーズについて

マッチ数の暴発でページが固まらないよう、5,000 件の上限を設けています。ただし 1 回のマッチ内での壊滅的なバックトラックは防げません。(a+)+$ のような式を、似ているが一致しない長い文字列に当てると、ブラウザには正規表現のタイムアウト機構がないためページは固まり、タブを閉じるしかありません。入れ子の量指定子には注意してください。

使う場面

  • ログ解析や入力検証の正規表現を書きながら、一致位置とキャプチャグループの番号をその場で確認したいとき。括弧の置き方がグループをずらしていないかを見られます。
  • g フラグでのゼロ幅マッチや lastIndex の挙動(^、\b、空マッチ)を調べ、同じ位置で繰り返し一致しないか、手動で進める必要があるかを確かめたいとき。

使わないほうがよい場面

  • 正規表現が信頼できない入力(ユーザー定義ルール)だったり、対象テキストが 1MB を超えたりする場合。JavaScript はメインスレッドで同期実行され、タイムアウトも中断手段もないため、壊滅的なバックトラックでタブが固まります。
  • PCRE/PCRE2 の機能(\A、\z、原子グループ (?>)、条件、再帰)や、実際の置換・分割結果が必要な場合。JS の RegExp は構文が異なり、これらに対応しません。実際に動かすエンジンで試してください。
制限とプライバシー

マッチングとハイライトはブラウザ内で完結し、テキストは送信されません。制限:JS ネイティブの RegExp 構文で、PCRE ではありません。フラグは g、i、m、s のみ。5000 件の上限は結果の爆発を防ぐもので、1 回のマッチでの壊滅的なバックトラックやタイムアウトには対応できません。対象は 1MB 程度までを目安にしてください。

よくある質問

正規表現でページが固まることはありますか?

あります。しかもここでの 5000 件上限では防げません。上限が制限するのは一致件数で、短いパターンが長い文書に大量一致する場合の対策です。本当に危険なのは 1 回のマッチ内部で起きる壊滅的なバックトラックで、(a+)+$ を長い a の連続の末尾に一致しない文字を 1 つ付けた文字列に当てる典型例では、所要時間が長さに対して指数関数的に伸びます。ブラウザに regex のタイムアウトはなく、メインスレッドは計算し終わるまで止まれず、タブを閉じるのが唯一の逃げ道です。入れ子の量指定子を避け、.* をより具体的な文字クラスに置き換え、先に対象テキストの長さを制限してください。

対応しているフラグは? u や y がないのはなぜ?

g、i、m、s の 4 つです。それぞれ全体、大文字小文字の無視、複数行、ドットの改行一致に対応します。u(Unicode コードポイント)、y(sticky)、d(indices)、v(Unicode セット)の切り替えはありません。必要な場合はコンソールで自分で new RegExp してください。u はエスケープや量指定子の解釈を変えるため、絵文字や \p{...} を含むパターンは u なしでは 1 件も一致しないことがあります。

キャプチャグループの「未マッチ」とは?

そのグループがマッチに関与しなかったという意味で、値は空文字ではなく undefined です。省略可能な (a)? や、選ばれなかった分岐で起こります。ハイライトと replace の結果が食い違うこともあります。replace では undefined のグループが空文字になるため、判定は真偽値ではなく !== undefined で行ってください。真偽値で判定すると、正当な空マッチを未マッチと誤認します。