如何评估表达式字符串,如下例所示?我正在寻找一种简单的方法来解析它们。
string1: "True and False"
bool: false
string1: "False and False"
bool: false
string1: "true or False"
bool: true
答案 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;假是假的