您的位置:首页 > 编程语言 > Java开发

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

2016-06-08 16:31 274 查看
最近需要用到相关表达式解析的工具,然后去网上搜索,找到了一个用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的表达式解析工具很简单,也非常容易根据自己的需求进行扩展,关于相关的代码,会在以后的博文中会共享出来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: