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

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值