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

写了一个判断四则运算合法性较验的式子。

48304ba5e6f9fe08f3fa1abda7d326ab.png

public static bool CheckExpressionValid(string input)

{

string pattern = @"^(((?\()[-+]?([0-9]+[-+*/])*)+[0-9]+((?\))([-+*/][0-9]+)*)+($|[-+*/]))*(?(o)(?!))$";

//去掉空格,且添加括号便于进行匹配

return Regex.IsMatch("(" + input.Replace(" ", "") + ")", pattern);

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

public static bool CheckExpressionValid(string input)

{

string pattern = @"^(((?\()[-+]?([0-9]+[-+*/])*)+[0-9]+((?\))([-+*/][0-9]+)*)+($|[-+*/]))*(?(o)(?!))$";

//去掉空格,且添加括号便于进行匹配

return Regex.IsMatch("("+ input.Replace(" ", "") + ")", pattern);

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

较难的地方在于括号的匹配,(?  \()是用来把左括号保存到o变量下,对应于(?  \))用来去掉左括号,(?(o)(?!)) 是匹配完了右括号后,如果还剩下左括号,则不需再进行匹配。

测试代码

48304ba5e6f9fe08f3fa1abda7d326ab.png

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();

48304ba5e6f9fe08f3fa1abda7d326ab.png

项目中用到的地方是与此略有不同,表达式为:"产品面积*单价",所以调用CheckExpressionValid函数前需要再转换一下,转换较为简单,将"产品面积"替换成数字即可,[\u4e00-\u9fa5])+用来匹配中文。

48304ba5e6f9fe08f3fa1abda7d326ab.png

private static bool CheckCalcExpressionValid(string expression)

{

string parttern = @"(产品面积|单价|印张数量)\.([\u4e00-\u9fa5])+";

string matchparttern = "1 ";

return CheckExpressionValid(Regex.Replace(expression, parttern, matchparttern));

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值