java中正则表达式用Pattern计算字符串的结果(四则运算);分成有括号和没括号;当然也可以采用逆波兰式
来源:互联网 发布:惰性知乎 编辑:程序博客网 时间:2024/05/18 00:22
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Arithmetic {
/**
* 利用Pattern计算字符串的结果(四则运算),当然也可以采用逆波兰式
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
/*String str="2+3*(5*(12-6))";
Pattern pa=Pattern.compile("\\(([^\\(\\)]*)\\)");// \\(为左括号 \\)右括号,表示在括号内没有其他括号,然后用括号括起来是一个子组
Matcher ma=pa.matcher(str);
if (ma.find()) {//若匹配的存在
System.out.println(ma.group());//输出全部
System.out.println(ma.group(1));//输出第一个子组
}*/
System.out.println(calcu("5 +3 * 2*(2+2-3)-1"));
}
/**
* 计算可能含有括号的表达式
* @param s
* @return
*/
public static String calcu(String s) {
s=s.replaceAll(" +", "");//消除空格,空格可以是一个或多个,找到就替换
Pattern pa=Pattern.compile("\\(([^\\(\\)]*)\\)");// \\(为左括号 \\)右括号,表示在括号内没有其他括号,然后用括号括起来是一个子组e
while (true) {
Matcher ma=pa.matcher(s);
if (ma.find()==false)break;
//先计算括号内,然后消除括号
s=s.replace(ma.group(), calcuNoParen(ma.group(1)));
}
return calcuNoParen(s);
}
/**
* 计算没有括号的运算
* @param s2
* @return
*/
public static String calcuNoParen(String s2) {
if (s2.length()<1) return s2;
//先把乘法消除
Pattern pat=Pattern.compile("([0-9]+)\\*([0-9]+)");//0-9一个或多个,乘法
while (true) {
Matcher mc=pat.matcher(s2);
if (mc.find()==false) break;
int res=Integer.parseInt(mc.group(1))*Integer.parseInt(mc.group(2));
//计算出结果,并且消除括号,注意这里不能用replaceAll
s2=s2.replace(mc.group(), res+"");
}
//再从左到右消除所有加法和减法
pat=Pattern.compile("([0-9]+)([\\+\\-])([0-9]+)");//0-9一个或多个,加法或者减法
while (true) {
Matcher mc=pat.matcher(s2);
if (mc.find()==false) break;
int res=0;
switch (mc.group(2)) {
case "+":
res=Integer.parseInt(mc.group(1))+Integer.parseInt(mc.group(3));
break;
case "-":
res=Integer.parseInt(mc.group(1))-Integer.parseInt(mc.group(3));
break;
}
//计算出结果,并且消除括号,注意这里不能用replaceAll
s2=s2.replace(mc.group(), res+"");
}
return s2;
}
}
22 0
- java中正则表达式用Pattern计算字符串的结果(四则运算);分成有括号和没括号;当然也可以采用逆波兰式
- 用Java模拟通过四则运算表达式字符串,构造逆波兰表达式,计算结果(转载一大牛)
- 表达式计算 四则运算(有括号)的计算
- 用Java模拟通过四则运算表达式字符串,构造逆波兰表达式,计算结果
- 逆波兰式实现四则运算表达式计算器支持括号、十六进制
- 计算带括号的四则运算表达式
- 中缀表达式的计算(只包含四则运算与括号)
- 正则表达式(括号)、[中括号]、{大括号}的区别小结
- 正则表达式(括号)、[中括号]、{大括号}的区别小结
- 正则表达式(括号)、[中括号]、{大括号}的区别小结
- 正则表达式(括号)、[中括号]、{大括号}的区别小结
- 正则表达式(括号)、[中括号]、{大括号}的区别小结
- 正则表达式(括号)、[中括号]、{大括号}的区别小结
- 正则表达式(括号)、[中括号]、{大括号}的区别小结
- 正则表达式(括号)、[中括号]、{大括号}的区别小结
- 正则表达式(括号)、[中括号]、{大括号}的区别小结
- 正则表达式(括号)、[中括号]、{大括号}的区别小结
- 正则表达式(括号)、[中括号]、{大括号}的区别小结
- php操作mysql类库
- ACM-DFS之Zipper——hdu1501
- 笑死人
- 一步步学习微软InfoPath2010和SP2010--第六章节--发布并提交表单数据(4)--作为内容类型发布
- 绝对路径和相对路径
- java中正则表达式用Pattern计算字符串的结果(四则运算);分成有括号和没括号;当然也可以采用逆波兰式
- 在函数外存取局部变量的一个比喻
- openVAS安装、启动
- 题目24-素数距离问题
- SSH框架首页初始化
- 在mvc中用ajax实现省市联动
- c++开源项目汇总
- Android 在地图上画矩形
- asp.net子页面刷新父页面以及页面自动刷新的方法