写了一个判断四则运算合法性较验的式子。
public static bool CheckExpressionValid(string input)
{
string pattern = @"^(((?\()[-+]?([0-9]+[-+*/])*)+[0-9]+((?\))([-+*/][0-9]+)*)+($|[-+*/]))*(?(o)(?!))$";
//去掉空格,且添加括号便于进行匹配
return Regex.IsMatch("(" + input.Replace(" ", "") + ")", pattern);
}
public static bool CheckExpressionValid(string input)
{
string pattern = @"^(((?\()[-+]?([0-9]+[-+*/])*)+[0-9]+((?\))([-+*/][0-9]+)*)+($|[-+*/]))*(?(o)(?!))$";
//去掉空格,且添加括号便于进行匹配
return Regex.IsMatch("("+ input.Replace(" ", "") + ")", pattern);
}
较难的地方在于括号的匹配,(? \()是用来把左括号保存到o变量下,对应于(? \))用来去掉左括号,(?(o)(?!)) 是匹配完了右括号后,如果还剩下左括号,则不需再进行匹配。
测试代码
string[] inputs = new string[]
{
"(",
"(() ",
"1 / ",
")1 ",
"+3 ",
"((1) ",
"(1)) ",
"(1) ",
"1 + 23",
"1+2*3 ",
"1*(2+3) ",
"((1+2)*3+4)/5 ",
"1+(2*) ",
"1*(2+3/(-4)) ",
};
foreach(string input in inputs)
{
Console.WriteLine("{0}:{1} ", input, CheckExpressionValid(input));
}
Console.ReadKey();
项目中用到的地方是与此略有不同,表达式为:"产品面积*单价",所以调用CheckExpressionValid函数前需要再转换一下,转换较为简单,将"产品面积"替换成数字即可,[\u4e00-\u9fa5])+用来匹配中文。
private static bool CheckCalcExpressionValid(string expression)
{
string parttern = @"(产品面积|单价|印张数量)\.([\u4e00-\u9fa5])+";
string matchparttern = "1 ";
return CheckExpressionValid(Regex.Replace(expression, parttern, matchparttern));
}