`
Eastsun
  • 浏览: 304319 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

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

阅读更多

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)
  • 描述: 修正后的源代码
  • 下载次数: 147
分享到:
评论
2 楼 ct455332 2010-03-27  
因为我是 java菜鸟。额所以不行的啊
1 楼 ct455332 2010-03-27  
我一直不太懂正则表达式。下午自己弄了个仿造你的这个结果快150行。。。囧

相关推荐

    精通正则表达式基于.NET ASP PHP JSP JavaScript

    RegexApplication/Default.aspx 正则表达式类的应用 RegexApplication/GetPageHtmlData.aspx 获取网页的内容 第10章(/10/) ASPNETValidator/Compare.aspx 比较验证 ASPNETValidator/...

    正则表达式

    正则表达式中的特殊字符 字符 含意 \ 做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意为匹配一个单词的边界。 -或- 对正则表达式功能字符的还原,如"*"匹配它...

    C#开发实例大全(基础卷).软件开发技术联盟(带详细书签) PDF 下载

    实例076 使用正则表达式验证一年的12个月份 92 实例077 使用正则表达式验证一个月的31天 93 实例078 使用正则表达式验证数字输入 94 实例079 使用正则表达式验证密码长度 95 实例080 使用正则表达式验证非零的正整数...

    JavaScript权威指南(第六版) 清晰-完整

    第10章 正则表达式的模式匹配 10.1 正则表达式的定义 10.2 用于模式匹配的String方法 10.3 RegExp对象 第11章 JavaScript的子集和扩展 11.1 JavaScript的子集 11.2 常量和局部变量 11.3 解构赋值 11.4 迭代 11.5 ...

    JavaScript权威指南(第6版)(中文版)

    第10章 正则表达式的模式匹配 10.1 正则表达式的定义 10.2 用于模式匹配的String方法 10.3 RegExp对象 第11章 JavaScript的子集和扩展 11.1 JavaScript的子集 11.2 常量和局部变量 11.3 解构赋值 11.4 迭代 11.5 ...

    JavaScript权威指南(第6版)

    第10章 正则表达式的模式匹配 10.1 正则表达式的定义 10.2 用于模式匹配的String方法 10.3 RegExp对象 第11章 JavaScript的子集和扩展 11.1 JavaScript的子集 11.2 常量和局部变量 11.3 解构赋值 11.4 迭代 11.5 ...

    JavaScript权威指南(第6版) 中文版

    第10章 正则表达式的模式匹配 253 10.1 正则表达式的定义 253 10.2 用于模式匹配的string方法 261 10.3 regexp对象 263 第11章 javascript的子集和扩展 267 11.1 javascript的子集 268 11.2 常量和局部变量 271 11.3...

    C#编程经验技巧宝典

    121 <br>0200 如何使用正则表达式验证电话号码 121 <br>0201 如何使用正则表达式验证输入密码条件 121 <br>0202 如何使用正则表达式验证邮政编号 121 <br>0203 如何使用正则表达式验证手机号 ...

    JavaScript权威指南(第6版)

    第10章 正则表达式的模式匹配 253 10.1 正则表达式的定义 253 10.2 用于模式匹配的string方法 261 10.3 regexp对象 263 第11章 javascript的子集和扩展 267 11.1 javascript的子集 268 11.2 常量和局部变量 271 11.3...

    JavaScript权威指南(第6版)中文文字版

    第10章 正则表达式的模式匹配 253 10.1 正则表达式的定义 253 10.2 用于模式匹配的string方法 261 10.3 regexp对象 263 第11章 javascript的子集和扩展 267 11.1 javascript的子集 268 11.2 常量和局部变量 271 11.3...

    UbuntuChina12

    7.4.3 整数值测试运算符 188 7.4.4 逻辑运算符 189 7.5 命令行的解释执行过程 190 7.5.1 读取命令行 191 7.5.2 命令历史替换 191 7.5.3 别名替换 192 7.5.4 花括号扩展 192 7.5.5 波浪号替换 192 7.5.6 I/O重定向 ...

Global site tag (gtag.js) - Google Analytics