/** * */ package com.e408.test; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @author laker.pan * @version 1.0 2010-01-14 */ public class Expression { // 提取括号表达式 public static final String REGEX_NOBRACKETS = "//([a-z//s{0,}//.#&//+//s{0,}//-//s{0,}//*//s{0,}///s{0,}]+//)"; public static final String REGEX_EXPRESS = "[a-z//.#&]*(//*|/)//s{0,}[a-z//.#&]*"; public static final String REGEX_EXPRESS1 = "[a-z//.#&]*(//+//s{0,}|//-//s{0,})[a-z//.#&]*"; // 替换掉括号 public static final String REGEX_REPLACEALL = "(^//()|(//)$)"; /** * @param args */ public static void main(String[] args) { String express = "a+b*c*(d-(e-g*t)/f)"; run(express); String result = "a.add(b.multiply(c).multiply(d.subtract(e.divide(f))))"; System.out.println("结果为:"+result); } public static void run(String expression){ expression = doExpression(expression, REGEX_NOBRACKETS, new ImpCallBackFunction() { public String doOperat(String _express, String regex) { _express = _express.replaceAll(REGEX_REPLACEALL, ""); _express = doF(_express , REGEX_EXPRESS); _express = doF(_express , REGEX_EXPRESS1); return _express; } }); expression = doF(expression , REGEX_EXPRESS); expression = doF(expression , REGEX_EXPRESS1); expression = expression.replace('#', '('); expression = expression.replace('&', ')'); System.out.println(expression); } public static String doF(String express , String regex ){ express = doExpression(express, regex, new ImpCallBackFunction() { public String doOperat(String _express, String regex) { return doCalc(_express); } }); return express; } public static String doCalc(String temp){ char flag = ' '; String string[] = null; if (temp.indexOf('*') > -1) { string = temp.split("//*"); flag = '*'; } else if (temp.indexOf('/') > -1) { string = temp.split("/"); flag = '/'; } else if (temp.indexOf('+') > -1) { string = temp.split("//+"); flag = '+'; } else if (temp.indexOf('-') > -1) { string = temp.split("//-"); flag = '-'; } return toE(string[0] , flag , string[1]); } public static String doExpression(String express , String regex , CallBackFunction newCallBackFunction){ Pattern pattern = Pattern.compile(regex); Matcher matcher = null; String temp = null; int start = -1 , end = -1; while (pattern.matcher(express).find()){ matcher = pattern.matcher(express); if(matcher.find()){ temp = matcher.group(); start = matcher.start(); end = matcher.end(); express = express.substring(0,start) + newCallBackFunction.doOperat(temp, regex) + express.substring(end); } } return express; } /** * @param left 左边 * @param middle 运算符 * @param right 右边 */ public static String toE(String left , char middle , String right){ String rtn = null; switch (middle){ case '+': rtn = left+".add#"+ right + "&";break; case '-': rtn = left+".subtract#" + right+"&";break; case '*': rtn = left+".multiply#" + right +"&";break; case '/' : rtn = left+".divide#"+ right+"&";break; default : rtn = null; break; } return rtn; } } interface CallBackFunction { public String doOperat(String express , String regex); } class ImpCallBackFunction implements CallBackFunction { public ImpCallBackFunction(){} /* (non-Javadoc) * @see com.e408.test.CallBackFunction#doOperat() */ public String doOperat(String express , String regex) { System.out.println("....."); return null; } }