回答:
正規表現の問題は、正規表現自体ではなく、バックトラックなどのあらゆる種類の「便利な」機能を備えた正規表現エンジンにあります。したがって、これらの機能なしで正規表現エンジンを使用することは避けられます。
コンピュータサイエンスの概念は、有限状態機械にコンパイルされた後、線形時間で常に一致させることができる正規表現です。したがって、ステートマシンベースの正規表現エンジンはReDoSには使用できません。ただし、病理学的な例では、必要なステートマシンがかなり大きくなる場合があります。ただし、使用可能なメモリを制限する方が、使用可能な計算時間を制限するよりも簡単な傾向があります。
RE2エンジンは信頼されていない正規表現に対処するために特別に開発され、線形時間の実行のために設計されました。
もう1つの方法は、簡略化された表記法から正規表現を自分で組み立てることです。たとえば、ユーザーにのようなglobパターンの使用を許可することができます*.txt
。次に、たとえばネストを許可せず、貪欲な量指定子のみを使用することにより、バックトラックを防ぐ方法でそれを解析できます。多くの使用例では、単純なパターン表記で完全に十分です。
正規表現を分析して、それ自体が遅くなるかどうかを確認し、分析自体が遅くなることなく、停止の問題を解決することになります。つまり、正しい完全なソリューションを見つけることはできません。
あなたは、もちろん、正しいとされる解決策を見つけることができます中に完全に。たとえば、安全に使用できる機能の制限付きホワイトリスト(たとえば、文字クラスyes、繰り返しno ...)を使用できます。これにより、多くの重要でない正規表現を通過させ、すべての重要な正規表現を拒否し、(間違って)大丈夫であるが複雑すぎて自動的に安全であることを証明できないものを拒否できます。
ラザロプロジェクトのパーサーの作成者として、特定のテキストで消費するリソースを特定の正規表現で理解する方法はないと言います。
同じリソースを費やすことなく、私は(少なくともBig-Oの意味で)意味します。
したがって、最良のアプローチ-別のスレッドでreパーサーを実行し、タイムアウト後にそれを強制終了します。
他の回答に加えて、解決策として、独自の正規表現ライブラリをロールすることもできます。これにより、実行中にパフォーマンスインストルメンテーションが可能になり、いくつかの基準が満たされた場合に実行を途中で中止することができます。
同様に、別のスレッドで正規表現を実行し、時間がかかりすぎる場合はスレッドを強制終了することができます。