基于Java的简易表达式解析工具(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/long2010yu2010/article/details/51613467

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



猜你喜欢

转载自blog.csdn.net/long2010yu2010/article/details/51613467
今日推荐