由于最近在做一个文本搜索器的需要,其中包含与或逻辑表达式计算的部分。所以特意封装了一个处理类,算法比较笨,还请大家多多指教!
class BoolExpression
{
internal bool IsRight(string expression)
{
bool isRight = true;
Regex regex0 = new Regex(@"((T|F)((\||\&)(T|F))*)");
Regex regex1 = new Regex(@"\(_\)");
Regex regex2 = new Regex(@"(_((\||\&)_)*)");
expression = regex0.Replace(expression, "_");
while (expression != "_")
{
if (regex1.IsMatch(expression))
{
expression = regex1.Replace(expression, "_");
}
else
{
isRight = false;
break;
}
if (regex2.IsMatch(expression))
{
expression = regex2.Replace(expression, "_");
}
else
{
isRight = false;
break;
}
}
return isRight;
}
internal bool Calculation(string expression)
{
while (expression != "F" & expression != "T")
{
char X, Y, logic;
for (int i = 0; i < expression.Length; i++)
{
if (expression[i] == 'F' | expression[i] == 'T')
{
X = expression[i];
if (expression[i + 1] == '|' | expression[i + 1] == '&')
{
logic = expression[i + 1];
if (expression[i + 2] == 'F' | expression[i + 2] == 'T')
{
Y = expression[i + 2];
}
else
{
continue;
}
if (logic == '|')
{
char R = 'F';
if (X == 'T' | Y == 'T')
{
R = 'T';
}
expression = expression.Substring(0, i) + R + expression.Substring(i + 3, expression.Length - i - 3);
break;
}
else if (logic == '&')
{
char R = 'T';
if (X == 'F' | Y == 'F')
{
R = 'F';
}
expression = expression.Substring(0, i) + R + expression.Substring(i + 3, expression.Length - i - 3);
break;
}
}
else if (expression[i + 1] == ')')
{
expression = expression.Substring(0, i - 1) + expression[i] + expression.Substring(i + 2, expression.Length - i - 2);
break;
}
}
else
{
continue;
}
}
}
return expression == "T" ? true : false;
}
}
IsRight方法:表达式的正确性检查(利用正则表达式):
((T|F)((\||\&)(T|F))*),代表任何一个简单表达式,将简单表达式替换成字符_
循环开始
\(_\),去掉最里层的括号(每次替换成_)
(_((\||\&)_)*),替换简单表达式(每次替换成_)
循环结束
若最终能替换成X则代表这是一个正确的表达式,若是在其中任何一步不能匹配则代表这个表达式是存在问题的。
Calculation方法:表达式的计算:
若表达式不能转换成T或者F则始终执行以下操作:
从左向右寻找第一个是T或者F的字符,若后一位是|或者&并且再后一位是T或者F则计算这个表达式,并且用结果替换原来的表达式。
若寻找到第一个的T或者F之后的字符是)则表示简单表达式已经计算完毕,需要讲这个值的左右括号消去。
关于简单二元表达式的计算,若是或计算,将结果预设为F,若两根值其中一个是T,则将结果改为T;若是与运算则结果预设为T,若其中有一个是F,则结果为F。
Demo
算法比较笨,大家有没有用一个正则表达式就能判断逻辑表达式是否正确的方法呢?计算应该也有更好的方法,可以提出来一起学习一下嘛!