求一个运算表达式的正则表达 例如有个运算表达式:"-1+2-3+4-5+6"因为"-"和"+"是同样的优先级,从左到右进行运算求一个正则表达式,如何运算出这个表达式的结果 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 求运行结果?那应该不是正则表达式能做的jdk 1.6以后import javax.script.*;try { String s = "-1+2-3+4-5+6"; ScriptEngineManager sem = new ScriptEngineManager(); ScriptEngine se = sem.getEngineByName("javascript"); Object obj = se.eval(s); System.out.println(obj);} catch (Throwable e) { e.printStackTrace();} 可以,如果你学过数据结果,应该知道算法的,就是把表达式转为后缀表达式,通过堆栈stack的压栈出栈来计算,具体代码就不写了,可以参考这个帖子http://topic.csdn.net/u/20110519/20/b23b6aaa-fd3f-4abb-aa1a-6f95b2ca9696.html 你那段代码可以算你的例子,但是如果算这个表达式" String s="3*4-2*4-3*4+5=";"就错了 import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test{ public static void main(String[] args){ String result = compute("3*4-2*4-3*4+5.5"); System.out.println(result); } public static String compute(String expression){ expression = "(" + expression + ")"; String regex = "(.*?)(\\([^()]+\\))(.*)"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(expression); while(matcher.find()){ expression = matcher.group(1) + compute1(matcher.group(2)) + matcher.group(3); matcher = pattern.matcher(expression); // System.out.println(expression); } return expression; } private static String compute1(String expression){ /* 计算没有包含括号的情况下的结果 */ expression = expression.replaceAll("[( )]",""); String regex = "^(.*?)(\\d+(?:\\.\\d+)?)([/*])(-?\\d+(?:\\.\\d+)?)(.*)"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(expression); double value1 = 0.0; double value2 = 0.0; String temp = null; while(matcher.find()){ value1 = Double.valueOf(matcher.group(2)); value2 = Double.valueOf(matcher.group(4)); if(matcher.group(3).equals("*")){ temp = (value1 * value2) + ""; }else{ temp = (value1 / value2) + ""; } expression = matcher.group(1) + temp + matcher.group(5); expression = expression.replaceAll("--","+"); matcher = pattern.matcher(expression); } //System.out.println(expression); regex = "^(.*?)((?:(?=[-+*/])-)?\\d+(?:\\.\\d+)?)([-+])(-?\\d+(?:\\.\\d+)?)(.*)"; pattern = Pattern.compile(regex); matcher = pattern.matcher(expression); while(matcher.find()){ value1 = Double.valueOf(matcher.group(2)); value2 = Double.valueOf(matcher.group(4)); if(matcher.group(3).equals("+")){ temp = (value1 + value2) + ""; }else{ temp = (value1 - value2) + ""; } expression = matcher.group(1) + temp + matcher.group(5); matcher = pattern.matcher(expression); } expression = expression.replaceAll("\\+",""); return expression; } } 关于java主线程的一道选择题 List的indexOf方法 swing 程序 响应一个按钮,让它结束程序,请问用哪个方法最好? 怎样在Java程序或socket或者rmi里去执行某个Servlet? 向大师们帮助解答: 如何用js将页面上的disabled="false"变成disabled="true"???? 大家帮我改下这程序 JDK里有关时间的类里有么判断某个日期是不是有效日期的方法? Java与C++的继承重载方法访问的区别? 请问大家到底刚如何去学习java? 一道static多项选择的题目 关于java数组的一道题目
jdk 1.6以后
import javax.script.*;try {
String s = "-1+2-3+4-5+6";
ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine se = sem.getEngineByName("javascript");
Object obj = se.eval(s);
System.out.println(obj);
} catch (Throwable e) {
e.printStackTrace();
}
http://topic.csdn.net/u/20110519/20/b23b6aaa-fd3f-4abb-aa1a-6f95b2ca9696.html
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test{
public static void main(String[] args){
String result = compute("3*4-2*4-3*4+5.5");
System.out.println(result);
}
public static String compute(String expression){
expression = "(" + expression + ")";
String regex = "(.*?)(\\([^()]+\\))(.*)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(expression);
while(matcher.find()){
expression = matcher.group(1) + compute1(matcher.group(2)) + matcher.group(3);
matcher = pattern.matcher(expression);
// System.out.println(expression);
}
return expression;
}
private static String compute1(String expression){
/*
计算没有包含括号的情况下的结果
*/
expression = expression.replaceAll("[( )]","");
String regex = "^(.*?)(\\d+(?:\\.\\d+)?)([/*])(-?\\d+(?:\\.\\d+)?)(.*)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(expression);
double value1 = 0.0;
double value2 = 0.0;
String temp = null;
while(matcher.find()){
value1 = Double.valueOf(matcher.group(2));
value2 = Double.valueOf(matcher.group(4));
if(matcher.group(3).equals("*")){
temp = (value1 * value2) + "";
}else{
temp = (value1 / value2) + "";
}
expression = matcher.group(1) + temp + matcher.group(5);
expression = expression.replaceAll("--","+");
matcher = pattern.matcher(expression);
}
//System.out.println(expression);
regex = "^(.*?)((?:(?=[-+*/])-)?\\d+(?:\\.\\d+)?)([-+])(-?\\d+(?:\\.\\d+)?)(.*)";
pattern = Pattern.compile(regex);
matcher = pattern.matcher(expression);
while(matcher.find()){
value1 = Double.valueOf(matcher.group(2));
value2 = Double.valueOf(matcher.group(4));
if(matcher.group(3).equals("+")){
temp = (value1 + value2) + "";
}else{
temp = (value1 - value2) + "";
}
expression = matcher.group(1) + temp + matcher.group(5);
matcher = pattern.matcher(expression);
}
expression = expression.replaceAll("\\+","");
return expression;
}
}