static BigDecimal getBasicArithmeticValue(String str, java.util.Map values) { ? ? ? ? str = multiReg(str, values); ? ? ? ? str = divReg(str, values); ? ? ? ? java.util.List signs = getPlusReduceSign(str);//获取符号 ? ? ? ? java.util.List valuesign = getValueSign(str);//替换符号 ? ? ? ? BigDecimal v = getValue(valuesign, signs, values); ? ? ? ? return v; ? ? } ? ? ? /** ? ? * 获取结果 ? ? * ? ? * @param valuesign 值替换符号 ? ? * @param signs 符号 ? ? * @param values 值存储表 ? ? * @return ? ? */ ? ? private static BigDecimal getValue(java.util.List valuesign, java.util.List signs, java.util.Map values) { ? ? ? ? BigDecimal value = values.get(valuesign.get(0)); ? ? ? ? for (int i = 0; i < signs.size(); i++) { ? ? ? ? ? ? if (signs.get(i)) { ? ? ? ? ? ? ? ? value = value.add(values.get(valuesign.get(i + 1))); ? ? ? ? ? ? ? ? //value += values.get(valuesign.get(i + 1)); ? ? ? ? ? ? } else { ? ? ? ? ? ? ? ? value = value.subtract(values.get(valuesign.get(i + 1))); ? ? ? ? ? ? ? ? //value -= values.get(valuesign.get(i + 1)); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? return value; ? ? } ? ? ? /** ? ? * 获取替换的符号 ? ? * ? ? * @param str 待匹配的字符串 ? ? * @return 返回 替换的值符号 ? ? */ ? ? private static java.util.List getValueSign(String str) { ? ? ? ? java.util.List list = new java.util.ArrayList(); ? ? ? ? Pattern patt = Pattern.compile("([a-zA-Z0-9]*{1})", Pattern.DOTALL); ? ? ? ? Matcher mat = patt.matcher(str); ? ? ? ? while (mat.find()) { ? ? ? ? ? ? if (mat.group(1).trim().equals("")) { ? ? ? ? ? ? ? ? continue; ? ? ? ? ? ? } ? ? ? ? ? ? list.add(mat.group(1)); ? ? ? ? } ? ? ? ? return list; ? ? } ? ? ? /** ? ? * 获取加减符号 ? ? * ? ? * @param str 待匹配的字符串 ? ? * @return 返回 符号顺序,加号为true,减号为false ? ? */ ? ? private static java.util.List getPlusReduceSign(String str) { ? ? ? ? java.util.List list = new java.util.ArrayList(); ? ? ? ? Pattern patt = Pattern.compile("([a-zA-Z0-9]*{1}([+|-])[a-zA-Z0-9]*{1})", Pattern.DOTALL); ? ? ? ? Matcher mat = patt.matcher(str); ? ? ? ? while (mat.find()) { ? ? ? ? ? ? if (mat.group(2).trim().equals("+")) { ? ? ? ? ? ? ? ? list.add(true); ? ? ? ? ? ? } else { ? ? ? ? ? ? ? ? list.add(false); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? return list; ? ? } ? ? ? /** ? ? * 乘法的正则 ? ? * ? ? * @param str 运算表达式字符串 ? ? * @param values 值存储表 ? ? * @return 返回重构后的字符串 ? ? */ ? ? private static String multiReg(String str, java.util.Map values) { ? ? ? ? Pattern patt = Pattern.compile("([a-zA-Z0-9]*{1}\\*[a-zA-Z0-9]*{1})", Pattern.DOTALL); ? ? ? ? Matcher mat = patt.matcher(str); ? ? ? ? while (mat.find()) { ? ? ? ? ? ? str = excMultiplication(str, mat.group(1), values); ? ? ? ? } ? ? ? ? return str; ? ? } ? ? ? /** ? ? * 除法的正则 ? ? * ? ? * @param str 运算表达式字符串 ? ? * @param values 值存储表 ? ? * @return 返回重构后的字符串 ? ? */ ? ? private static String divReg(String str, java.util.Map values) { ? ? ? ? Pattern patt = Pattern.compile("([a-zA-Z0-9]*{1}\\/[a-zA-Z0-9]*{1})", Pattern.DOTALL); ? ? ? ? Matcher mat = patt.matcher(str); ? ? ? ? while (mat.find()) { ? ? ? ? ? ? str = excDivsion(str, mat.group(1), values); ? ? ? ? } ? ? ? ? return str; ? ? } ? ? ? /** ? ? * 计算乘法 ? ? * ? ? * @param str 全部的运算字符串 ? ? * @param value 计算乘法的字符串 ? ? * @param map 值存储表 ? ? * @return 返回重构后的字符串 ? ? */ ? ? private static String excMultiplication(String str, String value, java.util.Map map) { ? ? ? ? String vs[] = value.split("\\*"); ? ? ? ? BigDecimal v1 = map.get(vs[0]); ? ? ? ? BigDecimal v2 = map.get(vs[1]); ? ? ? ? BigDecimal x = v1.multiply(v2); ? ? ? ? map.remove(vs[0]); ? ? ? ? map.remove(vs[1]); ? ? ? ? String uuid = getUUID(); ? ? ? ? map.put(uuid, x); ? ? ? ? str = str.replace(value, uuid); ? ? ? ? return str; ? ? } ? ? ? /** ? ? * 计算出发 ? ? * ? ? * @param str 全部的运算字符串 ? ? * @param value 计算乘法的字符串 ? ? * @param map 值存储表 ? ? * @return 返回重构后的字符串 ? ? */ ? ? private static String excDivsion(String str, String value, java.util.Map map) { |