一般的な最適な正規表現のヒント

正規表現は、データ処理ツールの不可欠な部分です。

さまざまなバリエーションで、さまざまな構文とさまざまな機能がサポートされていることは論理的です。

それにもかかわらず、正規表現自体の原理、正規表現マシン、および基本的な最適化設定は実質的に同じです。

ネットワークの広大さのどこかで、「正規表現は不規則なデータの解決には適していない」などのまったくばかげた声明を見ました。 まったくナンセンス。



別の問題として、検索パターンがインテリジェントであればあるほど、正規表現マシンはより強力になり、最終的に必要なものをテキストに「説明」することができます。

ところで、正規表現の最適化に関する古典的なFriedlの本には、章全体があります。 それの重要な部分は、章の構造そのものです。 最初に、式自体を最適化する一般的な原則が考慮され、次に最適化がプログラミング言語に適用されます。 つまり 最適化にはいくつかの段階がありますが、これを忘れないでください。



式自体にはいくつかの明らかなルールがあります。

  1. リテラル検索が最速です- / aa /通常は高速/ {2} /または/ [a] {2} /
  2. 長さが不定のデータの検索は無駄です(少なくともHKAバージョンの場合)。 データのサイズがわかっている場合-少なくともおおよそ指定してください。 / \ w {3,500} /高速/ \ w + /
  3. 括弧が存在する(そして保存されない!)ため、検索が遅くなります。 情報が必要ない場合は、セグメントを保持ブラケットで囲まないでください。テンプレートを書き換えて、保存しないものを拒否してください。 この要件は不可能な場合もありますが、留意する必要があります。 さらに、/(?:. *)one /のような構造で正規表現マシンを「助け」ようとするべきではありません。それはマシンを混乱させるだけです。
  4. 式自体の「本体」または置換用の式の「本体」に実行可能コードが存在することは破滅的です。 この手法は、他に方法がないと確信している場合にのみ使用してください。 / gスイッチを使用して暗黙的な式ループを「サドル化」するというアイデアは、多くの場合(JavaScript-確かに)時間の無駄です。 基本言語の「ネイティブ」サイクルは、正規表現マシンの動作中の入出力よりも1桁または2倍高速である可能性が最も高くなります。
  5. 置換は検索語よりもはるかに遅いです。 テキストの大きな部分を置き換える場合、テキストの新しいバージョンを作成する代替案について考えることは理にかなっています。 実装が困難であることが判明する場合もありますが、少なくともこのような問題について考えることは理にかなっています。
  6. 別の方法では検索が遅くなり、長さの不明な方法では速度が非常に遅くなるため、別のデザインを使用せずに複数のパスで検索する必要がある場合があります。
  7. 場合に適用できる場合は、行の開始/ ^ /および終了/ $ /の 「アンカー」を使用することを忘れないでください。
  8. 前後に「覗く」デザインは、通常、速度に悪影響を及ぼします。 テンプレートをより正確に定式化してください。
  9. $ `および$ 'コンストラクト(JavaScriptでは、これらはRegExp.leftContextおよびRegExp.rightContextです)を使用しないでください-構文解析が大幅に遅くなる可能性があります。


主な考え方は、一番上の棚から何を取り除く必要があるかを正確に説明すればするほど、カウンターの前に立つ時間が短くなるということです。 忘れずに、パン屋で「ビールを取引しない」とすぐに聞く方が、すべてのラックを20分間売り手に「そのようながらくたを与えて、説明する方法がわかりません...」と尋ねるよりも良い結果になります。 テンプレートがTOTALテキストに適用されたときにIS-NOバイナリソリューションを作成するのに近いほど、優れています。

特定のプログラミング言語へのプライベートな最適化に関して-すべてがとてつもなく難しい。 返されるデータの最小化に集中してください。 たとえば、パターンが一致するかどうかを確認するために置換演算子を実行することは意味がありません。 はい、そして偶然の一致自体は、最も「おしゃべりな」演算子を見つけ出すために試みることができます。 JavaScriptに、「match-not match」のみを報告する.test演算子があるとします。 これが興味のある唯一のものである場合は、.matchや.execではなく、それを使用してください。 このアドバイスは、正規表現に似た演算子を使用したPHPユーザーにとって特に価値があると思われます。

この記事は、読者(およびライター)に正規表現などの強力なツールを最適化するプロセスを考えさせる以外の何物でもありません。

それについて考えていますか? Friedlの「 正規表現 」を読み直し、そのような本がまだない場合は、すぐに購入してください!



All Articles