?? evals.java
字號:
/**
* @author lztly 李振滔 Whuhan University Of Science and Technology
* @作者 lztly 李振滔 武漢科技大學 計算機科學與技術2004級
* @description 利用正則式計算表達式的值
*/
import java.util.regex.*;
import java.util.*;
public class Evals{
public static final String NUM_PATTERN = //數字的匹配模式
"(?:(?<=[\\+\\-\\*\\(/]|^)[+-]|)" //前綴判斷,判斷前面的+-是否為符號
+"(?:" //數字及小數點部分, 0. 以及 .0 都是合法的數字
+"(?:\\d*\\.)?\\d+|" //.0 的情形
+"\\d+(?:\\.\\d*)?" //0. 的情形
+")"
+"(?!\\d|\\.)"; //邊界條件
public static final String BRA_PATTERN =
"\\((NUM)\\)".replace("NUM",NUM_PATTERN);
public static final String ADD_PATTERN =
"(NUM)\\+(NUM)".replace("NUM",NUM_PATTERN);
public static final String SUB_PATTERN =
"(NUM)-(NUM)".replace("NUM",NUM_PATTERN);
public static final String MUL_PATTERN =
"(NUM)\\*(NUM)".replace("NUM",NUM_PATTERN);
public static final String DIV_PATTERN =
"(NUM)/(NUM)".replace("NUM",NUM_PATTERN);
public static final Pattern BRA =Pattern.compile(BRA_PATTERN);
public static final Pattern ADD_OR_SUB =Pattern.compile("(?<=[^\\+\\-\\*/]|^)(?:"+ADD_PATTERN+"|"+SUB_PATTERN+")(?=[^\\*/]|$)");
public static final Pattern MUL_OR_DIV =Pattern.compile("(?<![\\*/])(?:"+MUL_PATTERN+"|"+DIV_PATTERN+")");
private static double operator(Matcher m,int index){
index =index*2;
double a,b;
if(m.group(1)!=null){
a =Double.parseDouble(m.group(1));
b =Double.parseDouble(m.group(2));
}
else{
index ++;
a =Double.parseDouble(m.group(3));
b =Double.parseDouble(m.group(4));
}
double r =0.0;
switch(index){
case 0:
r =a+b;
break;
case 1:
r =a-b;
break;
case 2:
r =a*b;
break;
case 3:
r =a/b;
break;
}
return r;
}
public static double eval(String str){
StringBuilder sb =new StringBuilder(str.replaceAll("\\s+",""));
while(true){
Matcher m =BRA.matcher(sb);
if(m.find()){
sb.replace(m.start(),m.end(),m.group(1));
}
else{
int index =1;
m =MUL_OR_DIV.matcher(sb);
if(!m.find()){
index --;
m =ADD_OR_SUB.matcher(sb);
if(!m.find()) break;
}
sb.replace(m.start(),m.end(),""+operator(m,index));
}
}
return Double.parseDouble(sb.toString());
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -