字符串处理:一个包括+-*/ 的字符串,如何将其转换分解为可计算的表达式
例如 ext1+ext2-ext3*ext4/ext5
其中ext1等表示的为变量
如何将其中的变量转换为实际变量计算.
请高手指点!小弟敬上.

解决方案 »

  1.   

    /**
     * 解析字符串,并计算字符串的值
     * @param str 需要计算的字符串
     * @return 字符串的计算结果
     */
    public static double computeString(String str){
    //创建Vector对象
    Vector v = new Vector();
    //解析字符串
    int beginIndex = 0;
    for(int i = 0;i < str.length();i++){
    //遇到运算符
    char c = str.charAt(i);
    if((c == '+') || (c == '-') || (c == '*') || (c == '/')){
    //截取字符串
    String temp = str.substring(beginIndex,i);
    //添加到Vector
    v.add(temp);
    //添加运算符
    v.add("" + c);
    //重新计算startIndex
    beginIndex = i + 1;
    }
    }
    //解析最后一个字符串
    v.add(str.substring(beginIndex));

    //计算
    compute(v,"*");
    compute(v,"/");
    compute(v,"+");
    compute(v,"-");
    //最后计算结果
    String result = (String)v.get(0);
    //转换成double,并返回
    return Double.parseDouble(result);
    }

    public static void compute(Vector v,String opr){
    //计算
    for(int i = 0;i < v.size();i++){
    //获得元素
    String temp = (String)v.get(i);
    //判断是运算符
    if(temp.equals(opr)){
    //前一个元素
    String pre = (String)v.get(i - 1);
    //后一个元素
    String next = (String)v.get(i + 1);
    //计算
    double result = 0;
    //根据不同的运算符进行运算
    if(opr.equals("*")){
    result = Double.parseDouble(pre) * Double.parseDouble(next);
    }else if(opr.equals("/")){
    result = Double.parseDouble(pre) / Double.parseDouble(next);
    }else if(opr.equals("+")){
    result = Double.parseDouble(pre) + Double.parseDouble(next);
    }else if(opr.equals("-")){
    result = Double.parseDouble(pre) - Double.parseDouble(next);
    }
    //删除原来的数据
    v.remove(i-1);
    v.remove(i-1);
    v.remove(i-1);
    //插入到原来的位置
    v.insertElementAt("" + result, i - 1);
    //因为数据改变,需要继续计算当前内容
    i--;
    }
    }
    }
      

  2.   

    满足你的要求~~~
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    public class TestRegex1 {

    public static void main(String[] args) {

    String s = "123.11-456.56+789*333";
    int count = 0;
    int signCount = 0;

    Pattern pNum = Pattern.compile("[0-9]{1}\\.[0-9]*[1,2,3,4,5,6,7,8,9]{1}|[1-9]{1}[0-9]*\\.[0-9]*[1,2,3,4,5,6,7,8,9]{1}|[1,2,3,4,5,6,7,8,9]{1}[0-9]*");
    Matcher mNum = pNum.matcher(s);
    Pattern pSign = Pattern.compile("\\+{1}|\\-{1}|\\*{1}|\\/{1}");
    Matcher mSign = pSign.matcher(s);

    mSign.reset();
    mNum.reset();
    while(mSign.find()) {
    count++;
    }
    signCount = count;
    while(mNum.find()) {
    count++;
    }

    String[] str = new String[count];

    int index = 0;
    mSign.reset();
    mNum.reset();
    while(mNum.find()) {
    str[index] = s.substring(mNum.start(), mNum.end());
    index+=2;
    }

    index = 1;
    while(mSign.find()) {
    str[index] = s.substring(mSign.start(), mSign.end());
    index+=2;
    }

    String[] temp;

    while(signCount>0) {

    for(int i=0;i<str.length;i++) {

    if("*".equals(str[i])) {
    str[i-1] = String.valueOf(Double.parseDouble(str[i-1])*Double.parseDouble(str[i+1]));
    str[i] = "null";
    str[i+1] = "null";
    temp = new String[str.length-2];
    int k = 0;
    for(int j=0;j<str.length;j++) {
    if("null".equals(str[j])) {
    continue;
    }
    temp[k++] = str[j];
    }
    str = temp;
    signCount--;
    continue;
    }

    if("/".equals(str[i])) {
    str[i-1] = String.valueOf(Double.parseDouble(str[i-1])/Double.parseDouble(str[i+1]));
    str[i] = "null";
    str[i+1] = "null";
    temp = new String[str.length-2];
    int k = 0;
    for(int j=0;j<str.length;j++) {
    if("null".equals(str[j])) {
    continue;
    }
    temp[k++] = str[j];
    }
    str = temp;
    signCount--;
    continue;
    }

    if("+".equals(str[i])) {
    str[i-1] = String.valueOf(Double.parseDouble(str[i-1])+Double.parseDouble(str[i+1]));
    str[i] = "null";
    str[i+1] = "null";
    temp = new String[str.length-2];
    int k = 0;
    for(int j=0;j<str.length;j++) {
    if("null".equals(str[j])) {
    continue;
    }
    temp[k++] = str[j];
    }
    str = temp;
    signCount--;
    continue;
    }

    if("-".equals(str[i])) {
    str[i-1] = String.valueOf(Double.parseDouble(str[i-1])-Double.parseDouble(str[i+1]));
    str[i] = "null";
    str[i+1] = "null";
    temp = new String[str.length-2];
    int k = 0;
    for(int j=0;j<str.length;j++) {
    if("null".equals(str[j])) {
    continue;
    }
    temp[k++] = str[j];
    }
    str = temp;
    signCount--;
    continue;
    }

    }

    }

    System.out.println(str[0]);

    }}