我从其他人编写的配置文件中读取了一个逻辑字符串,其中包含以下表达式:
(VALUE_1)OR((NOT(VALUE_2))AND(NOT(VALUE_3)))
但是,我对于从何处开始解析并将我在其他地方存储为相同字符串名称的变量值进行比较感到有点困惑。我是否正确认为LambdaExpression是需要使用的东西?字符串是否需要以某种方式分裂并作为组成部分而不是作为整体进行分析?
编辑:
似乎Flee做了我需要做的事情,我可以在使用该库评估表达式之前将VALUE_x的名称定义为true或false。
答案 0 :(得分:1)
在C#中评估字符串表达式的典型方法是构建表达式树并将其编译为委托(此作业由.NET框架涵盖)。在大多数情况下,建议使用dynamic linq library,但它有几个缺点:它不支持作为可重用库(实际上它只是Scott Gu发布的LINQ功能的例证)并且它只能评估强类型表达式,这在大多数情况下是不好的现实生活中的应用。
我建议更好的替代方案:来自NReco Commons的lambda表达式解析器(这是免费的开源库)。它还构建表达式树,但使用完全不同的表达式解析方法并将其作为表达式树进行评估:它在运行时执行所有类型的协调和调用(如动态语言),支持属性和方法调用,数组构造和条件运算符。一些例子:
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 Commons库页面找到)
答案 1 :(得分: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();
使用匹配查询来处理匹配的变量名。
希望这有帮助