C#解析“(真实和真实)或(真或假)”

时间:2011-06-07 14:37:19

标签: c# string eval boolean-expression

C#:我有一个字符串变量,如下所示:

 string a = "(true and true) or (true or false)";

这可以是任何东西,它可以变得更复杂,例如:

 string b = "((true and false) or (true or false) and not (true and false)) and false";

我所知道的是它是正确的。不能发生这种表达不能被“评估”。

有没有办法让我能以某种方式评估这个?我只想知道该字符串的结果(结果)。这意味着我需要“true”或“false”而不是此字符串。

我想我可以制作一个解析方法,一步一步地减少字符串,直到我们得到最终值,但我想知道是否有更好的方法。

4 个答案:

答案 0 :(得分:10)

扩展Rob的评论,您可以将运行时编译与C#4.0 dynamic支持结合使用,并执行以下操作:

var expression = "(true and false) or (true or false)";

var helper = "" + 
    "using System; " + 
    "public class Expression {{ public bool Eval() {{ return {0}; }} }}";

var replaced = expression.Replace("and", "&&").Replace("or", "||");

var references = new string[] { "System.dll" };
var parameters = new CompilerParameters(references, "Test.dll");
var compiler = new CSharpCodeProvider();


var results = compiler.CompileAssemblyFromSource(
    parameters, 
    String.Format(helper, replaced));

dynamic exp = Activator.CreateInstance(
    results.CompiledAssembly.GetType("Expression"));

Console.WriteLine(exp.Eval());

答案 1 :(得分:7)

这样的事可能吗?

string previous = string.Empty;
while (b != previous) 
{
     previous = b;
     b = b.Replace("true and false", "false");
     b = b.Replace("true and true", "true");
     b = b.Replace("false and true", "false");
     b = b.Replace("false and false", "false");
     b = b.Replace("false or false", "false");
     b = b.Replace("true or false", "true");
     b = b.Replace("true or true", "true");
     b = b.Replace("false or true", "true");
     b = b.Replace("(false)", "false");
     b = b.Replace("(true)", "true");
     b = b.Replace("not false", "true");
     b = b.Replace("not true", "false");
 }

请注意,该规范允许使用不同的配方,例如:

"false and false or true"
"false and true or true"

如果首先评估,则这两个表达式都是“true”,如果首先评估,则这两个表达式都为“false”。因此,要求每个级别的括号都会更好。需要从左到右评估是另一种选择,但这会使代码更复杂。

对于那些可能反对这种问题解决方案的人,请记住,一些数学家认为所有的数学都可以简化为这种符号操作。对于罗素和怀特黑德的 Principia Mathematica 的主要批评之一是said,它使公式具有太多意义。

答案 2 :(得分:2)

解析是你最好的选择。如果你必须检查拼写错误,那会让它变得更难。

答案 3 :(得分:-1)

C#没有Eval方法或类似的东西,只允许你运行这样的语句来获得最终结果。除非我遗漏了某些东西,否则你必须解析并减少这种方式。