(この記事はこちらの記事の翻訳版です。最新の記事では無いことをご了承くださいませ)

 

MEGアプライアンスは強力なフィルタリングツールです。この機能の一部として、様々なメッセージパートにおいてコンテンツを見つける必要があります。(可能な)ワイルド カードを用いた単純な文字列だけをフィルタすることは大方可能ではありますが、特定の形式でのコンテンツをフィルタする必要が時々出てきており、しかし前もって確度が高く 予測することが困難な場合もあります(元々定義されている形式をマッチされる場合を除く)。このような場合に、正規表現は強力なツールです。

しかし、スパイダーマンの格言に「強い力には重い責任を伴う」とあるように、正規表現にもツールとしては強力すぎる力を持っています。特定のパターンをマッチさせる時見か け上はランダムデータを拾うことも可能であり、我々が手動で設定するよりも遥かに速く実行することが可能です。しかし、正規表現が複雑になればなるほど、これを実行させる には更なるプロセッサへのオーバーヘッダが掛ります。加えて、正規表現は文字列の検索、様々な長さや定義されて無い文字長のブロックまで検索し、特定のパターンをマッチさ せます。

正規表現の問題は、私が最近取り組んだお客様の問題でも見られたように、"(効果的に)無限の長さの文字列のパターンを参照" する場合があるという事です。これは常に理解されていることではありませんが、この種の正規表現のもっとも単純なパターンは ".*" (クオーテーションを除く)であります。この文字列は全ての文字を一回もしくはそれ以上マッチさせるという事を意味します。しかし、その長さには制限が無いために、この 結果システムが我々が通常期待しているよりも長い文字よりも長くし続けてしまうという可能性が高くなります。

重大な予期できないCPUの利用が発生することを防ぐために、* や + を正規表現で使用する際には十分慎重になることをお勧めいたします。無制限に検索する必要が無い場合は、{1,100} のような構文を付けていただくと良いでしょう。これは前述のアイテムを100文字までマッチさせるがそれ以上は行わないことを示します。これによって実際のビジネス上で はあり得ないシステムが極端に長い文字列を検索しようとした時にCPUが過負荷に陥ってしまうケースを防ぎます。