将字符串表达式转换为布尔逻辑 - C#

6

我希望将一个字符串表达式转换为一个真正的布尔表达式。

以下表达式将作为输入(字符串):

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

变量A、B和C将具有布尔值(true或false)。

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


2
可能是Evaluating string "3*(4+2)" yield int 18的重复问题。 - Hari Prasad
1个回答

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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接