基於Java的簡易表達式解析工具(一)


最近需要用到相關表達式解析的工具,然后去網上搜索,找到了一個用C#寫的表達式解析工具,仔細看了功能后發現,這正是我需要的,如果我能將它改造成基於Java語言的方式,豈不是更好嗎,所以花了一段時間,把網上的C#的代碼轉換成了Java的代碼,如今已經用它處理完美的處理一些表達式解析的工作。

先來看下這個基於Java的表達式解析工具都可以做些什么吧!

1、可以完成加、減、乘、除、取余、次冪的運算解析。

2、可以完成按位與、按位或、邏輯與、邏輯或、邏輯非的運算解析。

3、可以完成相等、不相等、大於、小於、大於等於、小於等於、左移位,右移位的運算解析。

4、可以完成包含、不包含、已什么開始、已什么結束運算解析。

我相信,這些基礎的功能,完全可以滿足大部分的需求了,而這個工具僅僅只有5個類完成(ExpressionEvaluator,ExpressionException,ExpressionNode,ExpressionNodeType,ExpressionParser)。

如果想要開發新的表達式解析規則,也是很容易的,完全可以把我們在Java里使用的一些函數和功能,通過定義一種表達式輸入規則,配置到代碼中,完成表達式解析的工作。關於表達式解析的算法,主要采用了逆波蘭表達式

先來看看用法吧:

例子1:

[java]  view plain  copy
 
 print?
  1. public class Test2 {  
  2.       
  3.     public static void main(String[] args){  
  4.           
  5.         //加法運算  
  6.         String plusStr = "1 + 2";  
  7.         System.out.println(ExpressionEvaluator.eval(plusStr));  
  8.           
  9.         //減法運算  
  10.         String subtractStr = "20 - 6";  
  11.         System.out.println(ExpressionEvaluator.eval(subtractStr));  
  12.           
  13.         //乘法運算  
  14.         String multiPlyStr = "3 * 5";  
  15.         System.out.println(ExpressionEvaluator.eval(multiPlyStr));  
  16.           
  17.         //除法運算  
  18.         String divideStr = "20 / 4";  
  19.         System.out.println(ExpressionEvaluator.eval(divideStr));  
  20.           
  21.         //次冪運算  
  22.         String powerStr = "2 ^ 3";  
  23.         System.out.println(ExpressionEvaluator.eval(powerStr));  
  24.           
  25.         //取余運算  
  26.         String modStr = "4 % 3";  
  27.         System.out.println(ExpressionEvaluator.eval(modStr));  
  28.           
  29.         //混合運算  
  30.         String resultStr = "(1 + 2) - 4 * 3 + 2^2 + 4%3";  
  31.         System.out.println(ExpressionEvaluator.eval(resultStr));  
  32.           
  33.     }  
  34. }  

 

輸出結果如下:

3.0
14.0
15.0
5.0
8.0
1.0
-4.0

 

例子2:

 

[java]  view plain  copy
 
 print?
  1. public class Test2 {  
  2.       
  3.     public static void main(String[] args){  
  4.           
  5.         String s1 = "(1 + 2) == 3";  
  6.         System.out.println(ExpressionEvaluator.eval(s1));  
  7.           
  8.         String s2 = "(20 - 6) < 3";  
  9.         System.out.println(ExpressionEvaluator.eval(s2));  
  10.           
  11.         String s3 = "(3 + 1) == 4 && 5 > (2 + 3)";  
  12.         System.out.println(ExpressionEvaluator.eval(s3));  
  13.           
  14.         String s4 = "\"hello\" == \"hello\" && 3 != 4";  
  15.         System.out.println(ExpressionEvaluator.eval(s4));  
  16.           
  17.         String s5 = "\"helloworld\" @ \"hello\" &&  \"helloworld\" !@ \"word\" ";  
  18.         System.out.println(ExpressionEvaluator.eval(s5));  
  19.           
  20.     }  
  21. }  


輸出結果如下:

 

true
false
false
true
true

而在實際使用的過程中,通常需要在界面上配置,配置的時候可能是如下的樣子:

【字段一】包含 “helloword” 並且 【字段二】 不等於 “hello"

當這個表達式在使用的時候,通常需要有一步轉換的工作,在調用表達式解析的時候,首先需要把在前台定義好一種解析的格式規則,然后前台用戶根據規則輸入的合法的表達式,到后台時首先轉換成表達式解析能識別的格式,然后在交給表達式解析工作解析。

這個基於Java的表達式解析工具很簡單,也非常容易根據自己的需求進行擴展,關於相關的代碼,會在以后的博文中會共享出來。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM