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) –