求一个运算表达式的正则表达 例如有个运算表达式:"-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; } } CSDN的一个小BUG 请教连sql server2000的出现 jdbc connection reset by peer:socket write error 安装JDK不成功,请指导 如何把这段正则表达式转成JAVA的,谢谢 帮我看看,为什么错了啊?怎么改?? 菜鸟愚问 请问哪个版人气最旺,我想问一个关于VSS的问题。 herowu谢谢你的帮助 这个问题难道没有人遇到过吗,奇怪*********************** Java语言可以编织爱情吗?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;
}
}