コンテンツへスキップ
uencoder

正規表現をパフォーマンス向けに最適化する

遅い正規表現は ReDoS(Regular Expression Denial of Service)を引き起こします。破壊的バックトラッキングの特定と修正、アトミックグループ、パターンのアンカーを学びましょう。

  1. 1

    よくあるパフォーマンス問題:(1) 壊滅的バックトラッキング — (a+)+ のような入れ子の量指定子は指数関数的なバックトラッキングを引き起こします。(2) アンカーなしパターン — .* は文字列全体を走査します。(3) 広すぎる選択 — (a|ab|abc) はすべての分岐を試します。修正方法:絶対量指定子(a++)、アトミックグループ(?>...)、. の代わりに具体的な文字クラス、^ と $ によるパターンのアンカーを使ってください。

  2. 2
    正規表現テスター →

    最適化したパターンを、以前に遅延の原因となった最悪ケースの入力を含むさまざまな入力でテストします。実行時間を比較してください。10 秒かかっていたパターンは、最適化後はミリ秒で完了するはずです。

  3. 3
    正規表現置換ツール →

    最適化したパターンを置換操作でテストします。置換はすべてのマッチを処理するため、マッチングより遅くなることがあります。複数置換にはグローバルフラグ(g)を使い、出力が元のパターンの挙動と一致することを確認してください。

よくある質問

ReDoS とは何ですか?
Regular Expression Denial of Service(正規表現サービス拒否)です。正規表現が指数関数的な時間を要してサーバーが停止してしまう、悪意ある入力のことです。例:"aaaaaaaaaaaaaaaaaaaab" に対する (a+)+ は 2^n 通りの組み合わせを試します。絶対量指定子(a++)+、アトミックグループ、またはパターンの書き直しで修正してください。正規表現操作にはタイムアウトを設定してください。
ReDoS を防ぐにはどうすればよいですか?
安全な正規表現パターンを使い(入れ子の量指定子を避け、絶対/アトミックグループを使う)、正規表現操作にタイムアウトを設定し、信頼できない入力には線形時間の正規表現エンジン(RE2、Rust regex)を使い、パターンを最悪ケースの入力でテストしてください。safe-regex2 のようなライブラリでパターンの安全性を検証できます。

このタスクを解決するワークフロー

関連ツール