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;
}
}
本文介绍了一个使用Java实现的简单四则运算解析器。该解析器能够处理包含括号的数学表达式,通过正则表达式逐步计算乘除法及加减法,最终得出表达式的计算结果。
;分成有括号和没括号;当然也可以采用逆波兰式&spm=1001.2101.3001.5002&articleId=22714701&d=1&t=3&u=42a24603fea04dcfa91754ed72d028d1)
1130

被折叠的 条评论
为什么被折叠?



