6

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

今後もさらに多くの「フォーマット」をサポートする必要があります。

以下を使用して解決策を探しますか。

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

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

4

10 に答える 10

5

正規表現。

正規表現は、世界平和以外のほとんどすべてを解決できます。多分世界平和も。

于 2008-09-11T11:52:07.807 に答える
4

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

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

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

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

私はこれが決まり文句の答えであることを知っています、それはすべてあなたの正確なニーズが何であるかにかかっていますが、あなたが言ったことから、私はおそらく正規表現のバッグを使うでしょう.

の方法として、Vaibhav が指摘したように、発生する可能性のあるいくつかの異なる状況があり、どの状況が来るかを簡単に検出できる場合、適切なアルゴリズムを選択するプラグイン システムを作成でき、それらのアルゴリズムはすべて非常に異なる可能性があります。 1 つは先のとがったケースで Lex/Yacc を使用し、もう 1 つはより単純なケースで IndexOf と regex を使用します。

于 2008-09-11T12:14:38.970 に答える
1

何を解析しているかによります。正規表現で処理できる範囲を超えるものについては、ANTLRを使用しています。再帰下降構文解析に初めて飛び込む前に、このようなフレームワークを使用する前に、それらがどのように機能するかを調べます。MSDN Magazineを購読している場合は、2008年2月号で、ゼロから作成するための記事が掲載されていることを確認してください。

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

于 2008-09-11T12:36:41.617 に答える
1

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

于 2008-09-11T11:53:22.733 に答える
1

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

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

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

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

于 2008-09-11T12:28:49.203 に答える
0

@Coincoinが拠点をカバーしました。正規表現を使用すると、読みにくく、保守しにくいコードになってしまうことが特に簡単です。正規表現は強力で非常にコンパクトな言語であるため、そのように頻繁に使用されます。

正規表現内で空白とコメントを使用すると、正規表現の保守が容易になります。エリック・ガンナーソンは私にこの考えを思いついた。これが例です。

于 2008-09-11T12:48:29.233 に答える
0

PCRE を使用します。他のすべての回答は、次善の策です。

于 2009-05-06T06:22:49.447 に答える
0

正規表現はおそらくあなたが賭け、試して証明したものでしょう。さらに、正規表現をコンパイルできます。

于 2008-09-11T11:52:25.903 に答える
0

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

を使用IndexOfして何かを処理することもできますが、次のようなコードを書いていることにすぐに気付くかもしれません。

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

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

于 2008-09-11T12:21:19.173 に答える
-1

あなたが提供した情報がほとんどないので、正規表現を選択します。

しかし、どのような情報を解析したいのか、何をしたいのかによって、Lex/Yacc の決定が変わるかもしれません..

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

于 2008-09-11T11:55:12.857 に答える