在运行时评估boolish表达式字符串

时间:2014-01-23 19:26:21

标签: c# .net parsing expression

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

string1: "True and False"
bool: false

string1: "False and False"
bool: false

string1: "true or False"
bool: true

3 个答案:

答案 0 :(得分:0)

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

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的回答中所建议的那样(感谢Frode对此进行评论)。

答案 1 :(得分:0)

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

让我们试试你的第一个例子,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在您的问题评论中指出,是一个众所周知的语言解析器,可能会为您解决问题。我记得刚才读过这篇文章,但他比我快。 =)

答案 2 :(得分:0)

简单的事情可能是:

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&amp;&amp;在这个例子中假的错误不应该是'真'&amp;&amp;假是假的