2007-02-26

利用正则式计算表达式的值

关键字: JAVA 正则式 表达式 求值

RT,最近又看了下JAVA的正则式,解决了之前对JAVA中正则式的一些疑问.
写了个利用正则式计算表达式值的代码.算法很简单,就是"先乘除,后加减,有括号先算括号里的"
ps:当然,计算表达式值最常用也最有效的方法是利用逆波兰式,这儿只是拿正则式来练练手.
程序没有经过严谨的测试,可能有bug.

java 代码
  1. import java.util.regex.*;   
  2. import java.util.*;   
  3. /**  
  4. *利用正则式计算表达式的值  
  5. *@author: Eastsun  
  6. *@version: 0.5 07.2.26  
  7. */  
  8. public class Calculate{   
  9.     /*
  10.     正则式这块贴上来会影响代码结构,略之.
  11.     详见打包后的代码
  12.     */       
  13.     private static double operator(Matcher m,int index){   
  14.         index =index*2;   
  15.         double a,b;   
  16.         if(m.group(1)!=null){   
  17.             a =Double.parseDouble(m.group(1));   
  18.             b =Double.parseDouble(m.group(2));   
  19.         }   
  20.         else{   
  21.             index ++;   
  22.             a =Double.parseDouble(m.group(3));   
  23.             b =Double.parseDouble(m.group(4));   
  24.         }   
  25.         double r =0.0;   
  26.         switch(index){   
  27.             case 0:   
  28.                 r =a+b;   
  29.                 break;   
  30.             case 1:   
  31.                 r =a-b;   
  32.                 break;   
  33.             case 2:   
  34.                 r =a*b;   
  35.                 break;   
  36.             case 3:   
  37.                 r =a/b;   
  38.                 break;   
  39.         }   
  40.         return r;   
  41.     }   
  42.     public static double eval(String str){   
  43.         StringBuilder sb =new StringBuilder(str.replaceAll("\\s+",""));   
  44.         while(true){   
  45.             Matcher m =BRA.matcher(sb);   
  46.             if(m.find()){   
  47.                 sb.replace(m.start(),m.end(),m.group(1));   
  48.             }   
  49.             else{   
  50.                 int index =1;   
  51.                 m =MUL_OR_DIV.matcher(sb);   
  52.                 if(!m.find()){   
  53.                     index --;   
  54.                     m =ADD_OR_SUB.matcher(sb);   
  55.                     if(!m.find()) break;   
  56.                 }   
  57.                 sb.replace(m.start(),m.end(),""+operator(m,index));   
  58.             }   
  59.         }   
  60.         return Double.parseDouble(sb.toString());   
  61.     }                               
  62.     public static void main(String[] args){   
  63.         Scanner scan =new Scanner(System.in);   
  64.         while(true){   
  65.             System.out.print("\nEnter a expression :");   
  66.             String str =scan.next();   
  67.             if(str.equals("exit")) break;   
  68.             System.out.print(str +" = "+eval(str));   
  69.         }   
  70.     }   
  71. }  


  • Calculate.rar (1.1 KB)
  • 描述: 修正后的源代码
  • 下载次数: 64
评论
发表评论

您还没有登录,请登录后发表评论

Eastsun
搜索本博客
我的相册
1b680e5a-efae-3ec3-8ccd-970a4a72a056-thumb
6.5beta.PNG
共 61 张
最近加入圈子
存档
最新评论