import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class M
{
/**
* @author 于风
*/
Matcher mTemp, m;
Pattern p1 = Pattern.compile("\\d+?[*/]\\d+"), p2 = Pattern
.compile("\\d+?[+-]\\d+"), p = Pattern.compile("(?<=\\().+?(?=\\))");
public static void main(String[] args)
{
String jss = "(23+15/5+12)+1*10+(10*2+(10*2+1))";
// 要计算的四则式
System.out.println(new M().js(jss));
}
private String js(String s)
{
String temp, sTemp;
// 结束定义
try
{
m = p.matcher(s);
while (m.find())// 计算所有括号
{
sTemp = temp = m.group();
temp = sz(temp);
s = s.replace("(" + sTemp + ")", temp);
m = p.matcher(s);// 保证自此匹配的正确.
}
s = sz(s);
return s;
} catch (Exception e)
{
e.printStackTrace();
return "计算失败!有非法字符.";
}
}
private String sz(String temp)
{
String sTemp;
int iTemp = 0;
// 结束定义
mTemp = p1.matcher(temp);
while (mTemp.find())
{// 所有的乘除法
sTemp = mTemp.group();
if ((iTemp = sTemp.indexOf("*")) != -1)
{
iTemp = Integer.valueOf(sTemp.substring(0, iTemp))
* Integer.valueOf(sTemp.substring(iTemp + 1));
} else if ((iTemp = sTemp.indexOf("/")) != -1)
{
iTemp = Integer.valueOf(sTemp.substring(0, iTemp))
/ Integer.valueOf(sTemp.substring(iTemp + 1));
}
temp = temp.replace(sTemp, "" + iTemp);
mTemp = p1.matcher(temp);
}
mTemp = p2.matcher(temp);
while (mTemp.find())
{// 所有的加减法
sTemp = mTemp.group();
if ((iTemp = sTemp.indexOf("+")) != -1)
{
iTemp = Integer.valueOf(sTemp.substring(0, iTemp))
+ Integer.valueOf(sTemp.substring(iTemp + 1));
} else if ((iTemp = sTemp.indexOf("-")) != -1)
{
iTemp = Integer.valueOf(sTemp.substring(0, iTemp))
- Integer.valueOf(sTemp.substring(iTemp + 1));
}
temp = temp.replace(sTemp, "" + iTemp);
mTemp = p2.matcher(temp);
}
return temp;
}
}
我只是试了一些运算,不知道太复杂的情况是否可以保证结果的正确性.
所以未验证的情况下请先尝试.