基于Java的简易表达式解析工具(一)
最近需要用到相关表达式解析的工具,然后去网上搜索,找到了一个用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的表达式解析工具很简单,也非常容易根据自己的需求进行扩展,关于相关的代码,会在以后的博文中会共享出来。