利用正则表达式判断四则运算表达式是否合法
Posted 杨铭宇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用正则表达式判断四则运算表达式是否合法相关的知识,希望对你有一定的参考价值。
写了一个判断四则运算合法性较验的式子。
public static bool CheckExpressionValid(string input) { string pattern = @"^(((?<o>\()[-+]?([0-9]+[-+*/])*)+[0-9]+((?<-o>\))([-+*/][0-9]+)*)+($|[-+*/]))*(?(o)(?!))$"; //去掉空格,且添加括号便于进行匹配 return Regex.IsMatch("(" + input.Replace(" ", "") + ")", pattern); }
public static bool CheckExpressionValid(string input) { string pattern = @"^(((?<o>\()[-+]?([0-9]+[-+*/])*)+[0-9]+((?<-o>\))([-+*/][0-9]+)*)+($|[-+*/]))*(?(o)(?!))$"; //去掉空格,且添加括号便于进行匹配 return Regex.IsMatch("("+ input.Replace(" ", "") + ")", pattern); }
较难的地方在于括号的匹配,(? <o> \()是用来把左括号保存到o变量下,对应于(? <-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)); }
以上是关于利用正则表达式判断四则运算表达式是否合法的主要内容,如果未能解决你的问题,请参考以下文章
[正则表达式]7-9 判断E-mail地址是否合法 (20分)