最近需要用到相關表達式解析的工具,然后去網上搜索,找到了一個用C#寫的表達式解析工具,仔細看了功能后發現,這正是我需要的,如果我能將它改造成基於Java語言的方式,豈不是更好嗎,所以花了一段時間,把網上的C#的代碼轉換成了Java的代碼,如今已經用它處理完美的處理一些表達式解析的工作。
先來看下這個基於Java的表達式解析工具都可以做些什么吧!
1、可以完成加、減、乘、除、取余、次冪的運算解析。
2、可以完成按位與、按位或、邏輯與、邏輯或、邏輯非的運算解析。
3、可以完成相等、不相等、大於、小於、大於等於、小於等於、左移位,右移位的運算解析。
4、可以完成包含、不包含、已什么開始、已什么結束運算解析。
我相信,這些基礎的功能,完全可以滿足大部分的需求了,而這個工具僅僅只有5個類完成(ExpressionEvaluator,ExpressionException,ExpressionNode,ExpressionNodeType,ExpressionParser)。
如果想要開發新的表達式解析規則,也是很容易的,完全可以把我們在Java里使用的一些函數和功能,通過定義一種表達式輸入規則,配置到代碼中,完成表達式解析的工作。關於表達式解析的算法,主要采用了逆波蘭表達式。
先來看看用法吧:
例子1:
- public class Test2 {
- public static void main(String[] args){
- //加法運算
- String plusStr = "1 + 2";
- System.out.println(ExpressionEvaluator.eval(plusStr));
- //減法運算
- String subtractStr = "20 - 6";
- System.out.println(ExpressionEvaluator.eval(subtractStr));
- //乘法運算
- String multiPlyStr = "3 * 5";
- System.out.println(ExpressionEvaluator.eval(multiPlyStr));
- //除法運算
- String divideStr = "20 / 4";
- System.out.println(ExpressionEvaluator.eval(divideStr));
- //次冪運算
- String powerStr = "2 ^ 3";
- System.out.println(ExpressionEvaluator.eval(powerStr));
- //取余運算
- String modStr = "4 % 3";
- System.out.println(ExpressionEvaluator.eval(modStr));
- //混合運算
- String resultStr = "(1 + 2) - 4 * 3 + 2^2 + 4%3";
- System.out.println(ExpressionEvaluator.eval(resultStr));
- }
- }
輸出結果如下:
3.0
14.0
15.0
5.0
8.0
1.0
-4.0
例子2:
- public class Test2 {
- public static void main(String[] args){
- String s1 = "(1 + 2) == 3";
- System.out.println(ExpressionEvaluator.eval(s1));
- String s2 = "(20 - 6) < 3";
- System.out.println(ExpressionEvaluator.eval(s2));
- String s3 = "(3 + 1) == 4 && 5 > (2 + 3)";
- System.out.println(ExpressionEvaluator.eval(s3));
- String s4 = "\"hello\" == \"hello\" && 3 != 4";
- System.out.println(ExpressionEvaluator.eval(s4));
- String s5 = "\"helloworld\" @ \"hello\" && \"helloworld\" !@ \"word\" ";
- System.out.println(ExpressionEvaluator.eval(s5));
- }
- }
輸出結果如下:
true
false
false
true
true
而在實際使用的過程中,通常需要在界面上配置,配置的時候可能是如下的樣子:
【字段一】包含 “helloword” 並且 【字段二】 不等於 “hello"
當這個表達式在使用的時候,通常需要有一步轉換的工作,在調用表達式解析的時候,首先需要把在前台定義好一種解析的格式規則,然后前台用戶根據規則輸入的合法的表達式,到后台時首先轉換成表達式解析能識別的格式,然后在交給表達式解析工作解析。
這個基於Java的表達式解析工具很簡單,也非常容易根據自己的需求進行擴展,關於相關的代碼,會在以后的博文中會共享出來。
