2016-08-24 164 views
6

我想将字符串表达式转换为实际的布尔表达式。将字符串表达式转换为布尔逻辑 - C#

表达下面将是一个输入(字符串):

"(!A && B && C) || (A && !B && C) || (A && B && !C) || (A && B && C)" 

的变量A,B和C将有你的布尔值(真或假)。

如何转换字符串表达式,替换逻辑值并使用C#验证?

+2

[评估字符串可能重复“3 \ *(4 + 2) “yield int 18](http://stackoverflow.com/questions/333737/evaluating-string-342-yield-int-18) –

回答

-1
bool A = false; 
bool B = false; 
bool C = true; 
var expression = string.Format(@"(!{0} && {1} && {2}) || ({0} && !{1} && {2}) || ({0} && {1} && !{2}) || ({0} && {1} && {2})", A, B, C); 
expression = expression.Replace("&&", "and").Replace("||", "or").Replace("!true","False").Replace("!false","True").Replace("!True", "False").Replace("!False", "True"); 
DataTable dt = new DataTable(); 
var result = dt.Compute(expression, string.Empty); 
bool finalBooleanValue = Convert.ToBoolean(result); 
1

如果你不想使用一些可用的库来分析,你需要分开这些字符和实现基于比较的逻辑字符串。例如,假设我们有"a || b",我们可以循环每个字符并根据char == '|'决定适当的操作。对于更复杂的情况下我会使用一个stack保留每个结果的轨迹,像这样的可以处理&&||没有括号:

public bool ConvertToBool(string op, bool a, bool b) 
{ 
    var st = new Stack<bool>(); 
    var opArray = op.ToCharArray(); 
    var orFlag = false; 
    var andFlag = false; 

    for (var i = 0; i < opArray.Length; i++) 
    { 
     bool top; 
     switch (opArray[i]) 
     { 
      case '|': 
       i++; 
       orFlag = true; 
       break; 
      case '&': 
       i++; 
       andFlag = true; 
       break; 
      case 'a': 
       if (orFlag) 
       { 
        top = st.Pop(); 
        st.Push(top || a); 
        orFlag = false; 
       } 
       else if (andFlag) 
       { 
        top = st.Pop(); 
        st.Push(top && a); 
        andFlag = false; 
        continue; 
       } 
       st.Push(a); 
       break; 
      case 'b': 
       if (orFlag) 
       { 
        top = st.Pop(); 
        st.Push(top && b); 
        orFlag = false; 
       } 
       else if (andFlag) 
       { 
        top = st.Pop(); 
        st.Push(top && b); 
        andFlag = false; 
        continue; 
       } 
       st.Push(b); 
       break; 
     } 
    } 
    return st.Pop(); 
}