2009-09-10 4 views
5

私は正規表現のTONをキーとして保持するために何らかのデータオブジェクト(辞書を考えている)を作ろうとしています。次に文字列を取ります。それらと照合して、辞書から実際の値を取得します。私は大量のデータセットに対してこれを行う効率的な方法が必要です。と一致するC#の辞書の正規表現

私はC#を使用しています。どこから始めるべきかわかりません。

+0

これまでの回答に基づいて、特定のアプリケーションに関する質問に詳細を記入することをお勧めします。 –

+1

トンにはどれくらいの数の表現がありますか?一致するテキストのサイズはどれくらいですか?新しいテキストはどのくらいの頻度で提供されますか?結果をどのくらい早く返す必要がありますか? – TrueWill

答えて

7

なぜLINQを使用しないのですか?

Dictionary<string, string> myCollection = new Dictionary<string, string>(); 

myCollection.Add("(.*)orange(.*)", "Oranges are a fruit."); 
myCollection.Add("(.*)apple(.*)", "Apples have pips."); 
myCollection.Add("(.*)dog(.*)", "Dogs are mammals."); 
// ... 

string input = "tell me about apples and oranges"; 

var results = from result in myCollection 
       where Regex.Match(input, result.Key, RegexOptions.Singleline).Success 
       select result; 

foreach (var result in results) 
{ 
    Console.WriteLine(result.Value); 
} 

// OUTPUT: 
// 
// Oranges are a fruit. 
// Apples have pips. 
+0

私はこのソリューションを使い始めるつもりです。これまでのところ、約500項目の辞書でかなり高速に動作しています。それが悪化したら、私は他の選択肢を検討します。ありがとう! –

0

実際に正規表現が必要かどうかわかりません。trieを使用できます。辞書を表すことは、トライの一般的なアプリケーションです。 (私はあなたが言葉のリストのように辞書を意味し、 "連想配列"の意味ではないと仮定しています)。

0

文字列を正規表現と照合して正規表現をマッチさせることはできますか?または単にテキストにマッチしますか?言い換えれば、正規表現のうちの1つとなる文字列、または正規表現を適用するためのデータがありますか?

正規表現で、リスト内で見つけたい場合は、辞書は必要ありません。これは2つの部分のコンテナです。 ListまたはStringCollectionを使用し、IndexOf(mytString)を要求することもできます。つまり、そこには存在しません。

0

あなたの正規表現は、些細なシングルの文字列ではない、とあなたは、効率の世話をした場合は、最終状態での値で、単一NFA (nondeterministic finite-state automatonでそれらを表現したいと思います。入力が複数のregexpにマッチする可能性がある場合、最終状態には一連の値が必要です。

この時点で、オートマトンの最適化を検討する準備が整いました。それが事実上決定できれば(これによりNFAよりも指数関数的に大きいDFAが得られます)、是非それをしてください。一度DFAを作成すると、それを最小限に抑えることができます(ただし、最終状態に値があるので、usual algorithmの明白な変更が必要です)。

NFAを直接最小化する技術もあります。たとえば、2つの状態が同じサフィックスセット({(残りの文字列、値)})を持つ場合、それらは同等であり、組み合わせることができます。非環式NFAにおける同等性は、最終状態から開始してhash-consingを介して行うことができる。

0

正規表現を複数回使用する予定がある場合は、正規表現オブジェクトをコンパイルして作成し、再利用してオーバーヘッドを減らすことができます。

Regex RegexObject = new Regex(Pattern, RegexOptions.Compiled); 

このモデルを使用すると、パターン文字列ではなく正規表現オブジェクトを保存することをお勧めします。

関連する問題