6
我想将字符串表达式转换为实际的布尔表达式。将字符串表达式转换为布尔逻辑 - C#
表达下面将是一个输入(字符串):
"(!A && B && C) || (A && !B && C) || (A && B && !C) || (A && B && C)"
的变量A,B和C将有你的布尔值(真或假)。
如何转换字符串表达式,替换逻辑值并使用C#验证?
我想将字符串表达式转换为实际的布尔表达式。将字符串表达式转换为布尔逻辑 - C#
表达下面将是一个输入(字符串):
"(!A && B && C) || (A && !B && C) || (A && B && !C) || (A && B && C)"
的变量A,B和C将有你的布尔值(真或假)。
如何转换字符串表达式,替换逻辑值并使用C#验证?
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);
如果你不想使用一些可用的库来分析,你需要分开这些字符和实现基于比较的逻辑字符串。例如,假设我们有"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();
}
[评估字符串可能重复“3 \ *(4 + 2) “yield int 18](http://stackoverflow.com/questions/333737/evaluating-string-342-yield-int-18) –