質問

大量の電子メール (プレーン テキスト) を解析する必要があるシナリオがあります。各電子メールの「タイプ」は、さまざまなプラットフォームに対して実行されたスクリプトの結果です。タブ区切りのもの、スペース区切りのもの、まだ不明なものもあります。

将来的には、さらに多くの「形式」をサポートする必要もあります。

以下を使用して解決策を検討しますか?

  • 正規表現
  • 単純な文字列検索 (string.IndexOf などを使用)
  • レックス/ヤック
  • 他の

ソリューション全体は C# 2.0 (できれば 3.5) で開発されます。

役に立ちましたか?

解決

あなたが述べた 3 つのソリューションは、それぞれ非常に異なるニーズに対応しています。

手動解析 (単純なテキスト検索) は最も柔軟で順応性が高いですが、必要な解析がより複雑になるため、すぐに非常に面倒になります。

正規表現 これは中間点であり、おそらくここでの最善の策です。これらは強力でありながら、別の正規表現を呼び出すコードからロジックを自分で追加できるため、柔軟性があります。ここでの主な欠点は速度です。

レックス/ヤック 実際には、非常に複雑で予測可能な構文にのみ適応しており、コンパイル後の柔軟性があまりありません。解析中にパーサーを簡単に変更することはできません。実際には変更できますが、重すぎるため、代わりに正規表現を使用した方がよいでしょう。

これが決まり文句であることはわかっています 答え, 、それは実際にあなたの正確なニーズが何であるかによって決まりますが、あなたの言ったことから、私は個人的にはおそらく正規表現の袋を選ぶでしょう。

として 代替, Vaibhav 氏が指摘したように、いくつかの異なる状況が発生する可能性があり、どの状況が発生するかを簡単に検出できる場合は、適切なアルゴリズムを選択するプラグイン システムを作成できます。それらのアルゴリズムはすべて、Lex を使用するなど、まったく異なるものになる可能性があります。重要な場合には /Yacc を使用し、より単純な場合には IndexOf と正規表現を使用します。

他のヒント

正規表現。

Regex は世界平和以外のほとんどすべてを解決できます。まあ、もしかしたら世界平和もあるかもしれない。

おそらく、使用する文字列解析の種類に関係なく、プラグイン可能なシステムが必要です。そのため、このシステムは電子メールの種類に応じて適切な「プラグイン」を呼び出して解析します。

未知の状況が発生したときに対処できるように、ソリューションを更新可能に設計する必要があります。電子メールを解析して標準形式で結果を返すメソッドだけでなく、電子メールを検査してパーサーが実行されるかどうかを判断するメソッドも含む、パーサーのインターフェイスを作成します。

構成内で、使用するパーサーのタイプを特定し、その構成オプションと、パーサーが動作するかどうかを決定する識別子の構成を設定します。アセンブリへの静的リンクがない場合でも、実行時に型をインスタンス化できるように、アセンブリ修飾名でパーサーに名前を付けます。

識別子はインターフェイスも実装できるため、さまざまなものをチェックするさまざまな型を作成できます。たとえば、電子メールを特定のパターンで解析する正規表現識別子を作成できます。識別子が電子メールの内容だけでなくアドレスなどについても決定できるように、識別子が利用できる情報をできるだけ多く提供するようにしてください。

既知のパーサーがジョブを処理できない場合は、ジョブを処理できるパーサーと識別子インターフェイスを実装する型を含む新しい DLL を作成し、それらを bin ディレクトリにドロップします。

それは何を解析するかによって異なります。正規表現で処理できる範囲を超えるものについては、私はこれを使用しています アントラー. 。初めて再帰降下解析に取り組む前に、このようなフレームワークを使用する前に、再帰降下解析がどのように機能するかを調べます。MSDN マガジンを購読している場合は、ゼロから記事を作成する方法に関する記事が掲載されている 2008 年 2 月号をチェックしてください。

一度理解すれば、ANTLR の学習は非常に簡単になります。他にもフレームワークはありますが、ANTLR が最も多くのコミュニティ サポートと公開ドキュメントを備えているようです。著者も出版しています 決定的な ANTLR リファレンス:ドメイン固有言語の構築.

正規表現は、おそらく最も信頼され、試行され、証明されているものでしょう。さらに、正規表現をコンパイルすることもできます。

RegEx は他のオプションよりもはるかに高い柔軟性を提供するため、最適なオプションは RegEx です。

使用できる一方で、 IndexOf 何かを処理するために、すぐに次のようなコードを書くことになるかもしれません。

if(s.IndexOf("search1")>-1 || s.IndexOf("search2")>-1 ||...

これは 1 つの RegEx ステートメントで処理できます。さらに、次のような場所がたくさんあります RegExLib.com ここでは、問題を解決するために正規表現を共有している人を見つけることができます。

@Coincoin が基礎をカバーしました。正規表現を使用すると、特に読みにくく保守しにくいコードになりやすいことを付け加えておきたいと思います。Regex は強力で非常にコンパクトな言語なので、よくそうなります。

正規表現内で空白とコメントを使用すると、正規表現の保守が容易になります。エリック・ガナーソンが私にこのアイデアを教えてくれました。こちらです .

PCREを使用します。他のすべての回答は 2 番目に良いものにすぎません。

あなたが提供した情報が最小限であれば、私は Regex を選択するでしょう。

しかし、どのような種類の情報を解析したいのか、何をしたいのかによって、Lex/Yacc を選択するかどうかの決定が変わる可能性があります。

しかし、文字列検索についてはすでに決心しているようです:)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top