【Ruby3.x】Regexp::linear_time?()メソッドの使い方
linear_time?メソッドの使い方について、初心者にもわかりやすく解説します。
作成日: 更新日:
基本的な使い方
linear_time?メソッドは、正規表現のマッチング処理が、入力文字列の長さに比例する線形時間(O(n))で完了するかどうかを判定するメソッドです。
正規表現の中には、特定の入力文字列に対してマッチング処理の実行時間が極端に長くなる、いわゆる「正規表現のDoS(ReDoS)」脆弱性を引き起こすパターンが存在します。これは、正規表現エンジンがバックトラックと呼ばれる内部処理を繰り返し行い、処理時間が入力文字列の長さに対して指数関数的に増加してしまう場合に発生する可能性があります。
このメソッドは、与えられたRegexpオブジェクトが、このような非線形時間でのマッチングを引き起こす可能性のある構成を含んでいるかどうかを検査します。マッチングが線形時間で実行されると判断された場合はtrueを、そうでない可能性(つまりReDoSの潜在的なリスクがある場合)はfalseを返します。
特に、インターネットからのユーザー入力など、信頼できない情報源から提供された文字列を基に動的に正規表現を生成し、それを使ってデータの検証や抽出を行うシステムにおいて、このメソッドはセキュリティを向上させる上で非常に重要です。潜在的なReDoS攻撃を防ぎ、システムの安定稼働を維持するために、安全な正規表現であることを事前に確認する目的で利用されます。
構文(syntax)
1/pattern/.linear_time?
引数(parameters)
引数なし
引数はありません
戻り値(return)
Boolean
このメソッドは、正規表現のマッチングが線形時間で完了するかどうかを判定します。真偽値 (Boolean) を返します。