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
原创粉丝点击