900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 正则表达式 四则运算 java_利用正则表达式判断四则运算表达式是否合法

正则表达式 四则运算 java_利用正则表达式判断四则运算表达式是否合法

时间:2024-07-05 16:38:57

相关推荐

正则表达式 四则运算 java_利用正则表达式判断四则运算表达式是否合法

前两天修改bug时,发现有一处没有加表达式正确性判断后就给表达式赋了值(如表达式100+100/),导致后面应用表达式计算时出现了诡异的异常,此应用场景中,并不需要计算表达式,而是将表达式存为一个字段,后面会调用表达式进行计算。因此,仅需在给字段进行赋值时判断输入的表达式是否合法即可。怎样可以简单的判断呢?我想到了用正则表达式,在网上搜下看到时了一往篇老外的关于类似问题的文章(/b/bclteam/archive//03/15/396452.aspx),把《精通正则表达式》翻出来查了一下,试着写了一个判断四则运算合法性较验的式子。

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 ExpressionChecker.CheckExpressionValid(Regex.Replace(expression, parttern, matchparttern));

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。