基于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的表达式解析工具很简单,也非常容易根据自己的需求进行扩展,关于相关的代码,会在以后的博文中会共享出来。
基于Java的简易表达式解析工具(一)的更多相关文章
- 基于Java的简易表达式解析工具(二)
之前简单的介绍了这个基于Java表达式解析工具,现在把代码分享给大家,希望帮助到有需要的人们,这个分享代码中依赖了一些其他的类,这些类大家可以根据自己的情况进行导入,无非就是写字符串处理工具类,日期处 ...
- java后台常用json解析工具问题小结
若排版紊乱可查看我的个人博客原文地址 java后台常用json解析工具问题小结 这里不细究造成这些问题的底层原因,只是单纯的描述我碰到的问题及对应的解决方法 jackson将java对象转json字符 ...
- 基于Java的四大开源测试工具
摘要:成功的应用程序离不开测试人员和QA团队反复地测试,应用程序在进行最后的部署之前,需要通过测试来确保它的负载管理能力以及在特殊情况下的工作条件和工作加载情况. %R[)vA t]N0 测试是应用程 ...
- 你必须掌握的Java基础:JSON解析工具-json-lib
一.简介 json-lib是一个Java类库,提供将Java对象,包括beans,maps,collections,java arrays和xml等转换成JSON,或者反向转换的功能. 二.准备 在 ...
- JSON语言规范与Java中两种解析工具基本使用
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6652250.html 一:JSON语言规范 一言以蔽之:“一个 :一个键值对,一个{}一个对象,一个[]一个 ...
- Java爬虫利器HTML解析工具-Jsoup
Jsoup简介 Java爬虫解析HTML文档的工具有:htmlparser, Jsoup.本文将会详细介绍Jsoup的使用方法,10分钟搞定Java爬虫HTML解析. Jsoup可以直接解析某个URL ...
- Java数学表示式解析工具- jeval
这个包能够为我们提高高效的数学表达式计算. 举个样例:这个是我们策划给出的游戏命中率的一部份计算公式 是否命中=a命中率 – (b等级 – a等级) * (命中系数(6)* b闪避率 / 100)+3 ...
- java 之 xml 之解析工具jaxp
一.jaxp的api查看 *jaxp是javase一部分 *jaxp解析器在jdk的javax.xml.parsers包里面 *共四个类:分别针对dom和sax解析使用的类 *dom解析类: Docu ...
- 基于java的简易计算器实现
方法: 1.将string类型的表达式输入转换成后缀表达式 2.计算后缀表达式 步骤一:将string类型的表达式输入转换成后缀表达式 输入字符串表达式,并将表达式转换成char型数组 String ...
随机推荐
- Ubuntu14.04下Pycharm3.4 字体渲染
在ubuntu下搭建了django的开发环境,搭建过程十分简单,Pycharm的安装更简单,下载tar包解压并执行bin目录下的脚本即可,但是看着那个字体真心不爽.于是开始搜索调教. 1.安装打了渲染 ...
- Centos 7 安装 FFmpeg
Step 1: Update the system sudo yum install epel-release -y sudo yum update -y sudo shutdown -r now S ...
- [JS] 数据双向绑定原理
通常在前端开发过程中,经常遇到需要绑定两个甚至多个元素之间的值,比如将input的值绑定到一个h1上,改变input的值,h1的文字也自动更新. <h1 id="title" ...
- .net core使用NLog记录
首先使用Nugut安装NLog, NLog.Extensions.Logging,using NLog.Web,并且加上配置文件 ”nlog.config“,配置文件内容网上都可以百度的到.这是我自己 ...
- C# 一些代码小结--串口操作
串口解析显示中文 private String SerialPortReadStr() { try { String str = null; int n = serialPort1.BytesToRe ...
- STM32F4时钟配置库函数详解
在STM32中,所有的应用都是基于时钟,所以时钟的配置就尤为重要了,而不能仅仅只知道使用默认时钟. STM32F4的时钟树如上图所示,HSE为外部接入的一个8M的时钟,然后再给PLL提供输入时钟,经过 ...
- VS2017常用快捷键整理
项目相关的快捷键 Ctrl + Shift + B = 生成项目 Ctrl + Alt + L = 显示 Solution Explorer(解决方案资源管理器) Shift + Alt+ C = 添 ...
- js url 参数 转换成 json 对象数据
some=params&over=here => {"some":"params","over":"here&quo ...
- 隐藏导航栏,偏移20PX
1:让ViewController在NavigationBar下面开始布局. automaticallyAdjustsScrollViewInsets作用 当Controller上存在唯一一个UISc ...
- 栈的实现——c++
栈(stack),是一种线性存储结构,它有以下几个特点: (01) 栈中数据是按照"后进先出(LIFO, Last In First Out)"方式进出栈的. (02) 向栈中添加 ...