2012-02-01 5 views
2

を含む複雑な文字列を解析:しかし、私はのC# - 次のような表現が含まれている他の誰かによって書かれた設定ファイルから読み込ま私は論理的な文字列を持っている論理演算子

(VALUE_1)OR((NOT(VALUE_2))AND(NOT(VALUE_3))) 

ですこれを解析し、私が同じ文字列名として保存した変数の値を他の場所で比較する場所については、少し悩まされていました。私はLambdaExpressionが使用する必要があるものだと考えるのは正しいですか?文字列は何らかの方法で分割し、全体としてではなく構成要素として分析する必要がありますか?

EDIT:

Fleeが、私はそれが何をする必要があるかないかのように、私はそのライブラリを使用して式を評価する前に、真または偽としてVALUE_xの名前を定義することができるようです。

+1

あなたは、動的LINQのライブラリを使用することがあります。 http://stackoverflow.com/questions/821365/how -to-convert-a-string-to-equivalent-equivalent-expression-tree – vulkanino

+0

そのリンクは助けになりました、ありがとう - それは私がそれが必要なすべてをしたように見えるFleeに導かれました... –

答えて

0

文字列を単語の配列に変換し、各単語を格納された変数と照合することができると思います。

//Convert the string into an array of words 
     string[] source = line.Split(new char[] { '.', '?', '!', ' ', ';', ',','(',')' }, StringSplitOptions.RemoveEmptyEntries); 

     // Create and execute the query. It executes immediately 
     // because a singleton value is produced. 
     // Use ToLowerInvariant to match "data" and "Data" 
     var matchQuery = from word in source 
         where word.ToLowerInvariant().Contains("your stored variable elsewhere") 
         select word; 

     // Count the matches. 
     int varCount = matchQuery.Count(); 

一致する変数名を処理するmatchクエリを使用します。

ホープこれは式ツリーを構築し、(この仕事は、.NETフレームワークで覆われている)デリゲートにそれをコンパイルされたC#で文字列式を評価するための

+0

私はこれを必要とします私の変数名を解析し、それを変換するために、ここに戻ってこの側面の詳細を尋ねるかもしれません! –

+0

このリンクはあなたに役立つかもしれません - http://stackoverflow.com/questions/821365/how-to-convert-a-string-to-its-equivalent-expression-tree – DotNetUser

0

典型的なアプローチをすることができます。ほとんどの場合、dynamic linq libraryが推奨されていますが、再利用可能なライブラリとしてはサポートされていません(実際にはScott Guによって発行されたLINQ機能のみを示しています)。

私はより良い選択肢を提案します:ラムダ式パーサーNReco Commons(これはフリーでオープンソースのライブラリです)。また、式ツリーを作成しますが、式構文解析とそれを式ツリーとして評価するための全く異なるアプローチを使用します。実行時にすべての型の調和と呼び出しを実行し、プロパティとメソッドの呼び出し、配列の構築と条件付き演算子をサポートします。いくつかの例:

var lambdaParser = new NReco.LambdaParser(); 

var varContext = new Dictionary<string,object>(); 
varContext["pi"] = 3.14M; 
varContext["one"] = 1M; 
varContext["two"] = 2M; 
varContext["test"] = "test"; 
varContext["arr1"] = new double[] { 1.5, 2.5 }; 
Console.WriteLine(lambdaParser.Eval("pi>one && 0<one ? (1+8)/3+1*two : 0", varContext)); // --> 5 
Console.WriteLine(lambdaParser.Eval(" arr1[0]+arr1[1] ", varContext)); // -> 4 
Console.WriteLine(lambdaParser.Eval(" (new[]{1,2})[1] ", varContext)); // -> 2 

(より多くの例とドキュメントがNRecoコモンズライブラリページで見ることができる)

関連する問題