【问题标题】:C# - parsing a complex string containing logical operatorsC# - 解析包含逻辑运算符的复杂字符串
【发布时间】:2012-02-01 12:56:24
【问题描述】:

我从其他人编写的配置文件中读入了一个逻辑字符串,其中包含如下表达式:

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

但是,对于从哪里开始解析并比较我在其他地方存储为相同字符串名称的变量的值,我有点困惑。我认为 LambdaExpression 是需要使用的东西是否正确?字符串是否需要以某种方式拆分并作为组成部分而不是整体进行分析?

编辑:

似乎Flee 做了我需要它做的事情,我可以在使用该库评估表达式之前将 VALUE_x 的名称定义为 true 或 false。

【问题讨论】:

标签: c# parsing lambda expression


【解决方案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 图书馆页面找到)

【讨论】:

    【解决方案2】:

    我认为您可以将字符串转换为单词数组,然后根据存储的变量检查每个单词。

        //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();
    

    使用匹配查询来处理匹配的变量名。

    希望对你有帮助

    【讨论】:

    • 我需要这个来解析我的变量名并转换它们看起来,可能会回到这里询问有关这方面的更多信息!
    • 此链接可能对您有用 - stackoverflow.com/questions/821365/…
    猜你喜欢
    • 2020-05-02
    • 2013-11-16
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    • 1970-01-01
    相关资源
    最近更新 更多