基于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的表达式解析工具很简单,也非常容易根据自己的需求进行扩展,关于相关的代码,会在以后的博文中会共享出来。

原文地址:https://www.cnblogs.com/csguo/p/7614875.html