易码技术论坛

 找回密码
 加入易码
搜索
查看: 134721|回复: 3

[源码] 利用正则式计算表达式的值(JAVA代码)

[复制链接]
发表于 2007-4-3 18:24:25 | 显示全部楼层
Eastsun 兄居然仍然活跃在这里~~~~~

真牛啊
 楼主| 发表于 2007-4-3 23:30:56 | 显示全部楼层
嘿嘿,现在处于长期潜水中,偶尔冒个泡~
发表于 2007-4-14 01:29:46 | 显示全部楼层
写得漂亮呀,请教下~怎么把中缀表达式转成后缀表达式的形式呢?否则用不了逆波兰啊。。
 楼主| 发表于 2007-2-26 13:46:35 | 显示全部楼层 |阅读模式
RT,最近又看了下JAVA的正则式,解决了之前对JAVA中正则式的一些疑问.
写了个利用正则式计算表达式值的代码.
ps:当然,计算表达式值最常用也最有效的方法是利用逆波兰式,这儿只是拿来练练手.
程序没有经过严谨的测试,可能有bug.
  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.    public static final String NUM_PATTERN =              //数字的匹配模式
  10.                       "(?:(?<=[\\+\\-\\*/]|^)[+-]|)"  //前缀判断,判断前面的+-是否为符号
  11.                         +"(?:"                //数字及小数点部分,  0. 以及 .0 都是合法的数字
  12.                            +"(?:\\d*\\.)?\\d+|"    //.0 的情形
  13.                            +"\\d+(?:\\.\\d*)?"    //0. 的情形
  14.                         +")"
  15.                      +"(?!\\d|\\.)";             //边界条件
  16.    public static final String BRA_PATTERN =
  17.                       "\\((NUM)\\)".replace("NUM",NUM_PATTERN);
  18.    public static final String ADD_PATTERN =
  19.                       "(NUM)\\+(NUM)".replace("NUM",NUM_PATTERN);   
  20.    public static final String SUB_PATTERN =
  21.                       "(NUM)-(NUM)".replace("NUM",NUM_PATTERN);
  22.    public static final String MUL_PATTERN =
  23.                       "(NUM)\\*(NUM)".replace("NUM",NUM_PATTERN);
  24.    public static final String DIV_PATTERN =
  25.                       "(NUM)/(NUM)".replace("NUM",NUM_PATTERN);
  26.    public static final Pattern BRA =Pattern.compile(BRA_PATTERN);
  27.    public static final Pattern ADD_OR_SUB =Pattern.compile("(?<=[^\\+\\-\\*/]|^)(?:"+ADD_PATTERN+"|"+SUB_PATTERN+")(?=[^\\*/]|$)");
  28.    public static final Pattern MUL_OR_DIV =Pattern.compile("(?<![\\*/])(?:"+MUL_PATTERN+"|"+DIV_PATTERN+")");
  29.    
  30.    private static double operator(Matcher m,int index){
  31.       index =index*2;
  32.       double a,b;
  33.       if(m.group(1)!=null){
  34.         a =Double.parseDouble(m.group(1));
  35.         b =Double.parseDouble(m.group(2));
  36.       }
  37.       else{
  38.         index ++;
  39.         a =Double.parseDouble(m.group(3));
  40.         b =Double.parseDouble(m.group(4));
  41.       }
  42.       double r =0.0;
  43.       switch(index){
  44.         case 0:
  45.            r =a+b;
  46.            break;
  47.         case 1:
  48.            r =a-b;
  49.            break;
  50.         case 2:
  51.            r =a*b;
  52.            break;
  53.         case 3:
  54.            r =a/b;
  55.            break;
  56.       }
  57.       return r;
  58.    }
  59.    public static double eval(String str){
  60.       StringBuilder sb =new StringBuilder(str.replaceAll("\\s+",""));
  61.       while(true){
  62.         Matcher m =BRA.matcher(sb);
  63.         if(m.find()){
  64.            sb.replace(m.start(),m.end(),m.group(1));
  65.         }
  66.         else{
  67.            int index =1;
  68.            m =MUL_OR_DIV.matcher(sb);
  69.            if(!m.find()){
  70.               index --;
  71.               m =ADD_OR_SUB.matcher(sb);
  72.               if(!m.find()) break;
  73.            }
  74.            sb.replace(m.start(),m.end(),""+operator(m,index));
  75.         }
  76.       }
  77.       return Double.parseDouble(sb.toString());
  78.    }                  
  79.    public static void main(String[] args){
  80.       Scanner scan =new Scanner(System.in);
  81.       while(true){
  82.         System.out.print("\nEnter a expression :");
  83.         String str =scan.next();
  84.         if(str.equals("exit")) break;
  85.         System.out.print(str +" = "+eval(str));
  86.       }
  87.    }
  88. }
复制代码

Calculate.rar

2 KB, 下载次数: 139

打包的JAVA代码

您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-3-29 16:39 , Processed in 0.010620 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表