例如有个运算表达式:"-1+2-3+4-5+6"
因为"-"和"+"是同样的优先级,从左到右进行运算
求一个正则表达式,如何运算出这个表达式的结果

解决方案 »

  1.   

    求运行结果?那应该不是正则表达式能做的
    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();
    }
      

  2.   

    可以,如果你学过数据结果,应该知道算法的,就是把表达式转为后缀表达式,通过堆栈stack的压栈出栈来计算,具体代码就不写了,可以参考这个帖子
    http://topic.csdn.net/u/20110519/20/b23b6aaa-fd3f-4abb-aa1a-6f95b2ca9696.html
      

  3.   

    你那段代码可以算你的例子,但是如果算这个表达式" String s="3*4-2*4-3*4+5=";"就错了
      

  4.   


    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;   
        }   
    }