【问题标题】:Evaluate boolish expression string at runtime在运行时评估布尔表达式字符串
【发布时间】:2014-01-23 19:26:21
【问题描述】:

如何评估类似于以下示例的表达式字符串?我正在寻找一种简单的方法来解析它们。

string1: "True and False"
bool: false

string1: "False and False"
bool: false

string1: "true or False"
bool: true

【问题讨论】:

标签: c# .net parsing expression


【解决方案1】:

只要它始终遵循示例中给出的简单结构,这将起作用:

private static readonly Regex boolParseRegex =
    new Regex(@"^(true|false) (and|or) (true|false)$", RegexOptions.IgnoreCase);
public bool ParseExpression(string expr)
{
    var res = boolParseRegex.Match(expr);
    bool val1 = bool.Parse(res.Groups[1].Value);
    bool isAnd = string.Equals(res.Groups[2].Value, "and",
                               StringComparison.InvariantCultureIgnoreCase);
    bool val2 = bool.Parse(res.Groups[3].Value);
    return isAnd ? val1 && val2 : val1 || val2;
}

如果您希望能够解析更通用的表达式(例如,"true""(true and false) or true",除了"false and true"),您应该看看Irony,正如convert string expression to a boolean expression's 中推荐的那样回答(感谢Frode对此发表评论)。

【讨论】:

    【解决方案2】:

    如果您实现解析器或使用解析库,您想要的可能会实现。基本上,您需要将表达式分解为其组件,然后将它们解释为逻辑块;您的示例包含两种类型,值和运算符。

    让我们在您的第一个示例中尝试一下,True AND False

     True  <- value     : Carry it over
     AND   <- operator  : store
     False <- Value     : Use stored Operation on Carried value. Carry it over.
     End of expression
    

    如果添加分组,事情会变得有点复杂,因为您需要将序列存储在通常称为 表达式树 的结构中,因为它是分层的,并且需要您解析每个组,从“叶子”(离根最远)。让我们使用以下示例:

    False XOR (True AND False) OR (True OR False)
    

    表达式树如下所示:

      Root Group        : False XOR G1 OR G2
        Group 1         : True AND False
        Group 2         : True OR False
    

    使用您的表达式评估器,您需要先解决第 1 组和第 2 组:

      Root Group        : False XOR G1 OR G2
        Group 1         : False
        Group 2         : True
    

    然后将其应用到 Root 组:

    Root Group          : False XOR False OR True
    
     False <- value     : Carry it over
     XOR   <- operator  : store
     False <- value     : Apply stored Operation (result True). Carry it over.
     AND   <- operator  : store
     False <- Value     : Apply stored Operation (result True). Carry it over.
     - End of expression
    

    这基本上就是表达式解析器的工作原理。

    编辑:Irony,Frode 在对您的问题的评论中指出,是一个著名的语言解析器,可能会为您解决问题。我记得不久前读过它,但他比我快得多。 =)

    【讨论】:

      【解决方案3】:

      一些简单的事情可能是:

      static bool string_parser(string str_to_parse)
              {
                  bool result= false;
                  string[] parts = str_to_parse.Split(' ');
                  if (parts.Length == 3)
                  {
                      if (parts[0].ToLower().Contains("true"))
                      {
                          result = true;
                      }
                      if (parts[1].ToLower().Contains("or"))
                      {
                          if (parts[2].ToLower().Contains("true"))
                          {
                              result= result || true;
                          } 
                      }
                      else if (parts[1].ToLower().Contains("and"))
                      {
                          result = parts[2].ToLower().Contains("true") ? result && true : result && false;
                      }
                  }
                  return result;
              }
      

      但我想知道 False && False 在这个例子中不应该是 'True' false && false 是 false

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多