最近需要用到相关表达式解析的工具,然后去网上搜索,找到了一个用C#写的表达式解析工具,仔细看了功能后发现,这正是我需要的,如果我能将它改造成基于Java语言的方式,岂不是更好吗,所以花了一段时间,把网上的C#的代码转换成了Java的代码,如今已经用它处理完美的处理一些表达式解析的工作。

先来看下这个基于Java的表达式解析工具都可以做些什么吧!

1、可以完成加、减、乘、除、取余、次幂的运算解析。

2、可以完成按位与、按位或、逻辑与、逻辑或、逻辑非的运算解析。

3、可以完成相等、不相等、大于、小于、大于等于、小于等于、左移位,右移位的运算解析。

4、可以完成包含、不包含、已什么开始、已什么结束运算解析。

我相信,这些基础的功能,完全可以满足大部分的需求了,而这个工具仅仅只有5个类完成(ExpressionEvaluator,ExpressionException,ExpressionNode,ExpressionNodeType,ExpressionParser)。

如果想要开发新的表达式解析规则,也是很容易的,完全可以把我们在Java里使用的一些函数和功能,通过定义一种表达式输入规则,配置到代码中,完成表达式解析的工作。关于表达式解析的算法,主要采用了逆波兰表达式。

先来看看用法吧:

例子1:

  1. public class Test2 {
  2. public static void main(String[] args){
  3. //加法运算
  4. String plusStr = "1 + 2";
  5. System.out.println(ExpressionEvaluator.eval(plusStr));
  6. //减法运算
  7. String subtractStr = "20 - 6";
  8. System.out.println(ExpressionEvaluator.eval(subtractStr));
  9. //乘法运算
  10. String multiPlyStr = "3 * 5";
  11. System.out.println(ExpressionEvaluator.eval(multiPlyStr));
  12. //除法运算
  13. String divideStr = "20 / 4";
  14. System.out.println(ExpressionEvaluator.eval(divideStr));
  15. //次幂运算
  16. String powerStr = "2 ^ 3";
  17. System.out.println(ExpressionEvaluator.eval(powerStr));
  18. //取余运算
  19. String modStr = "4 % 3";
  20. System.out.println(ExpressionEvaluator.eval(modStr));
  21. //混合运算
  22. String resultStr = "(1 + 2) - 4 * 3 + 2^2 + 4%3";
  23. System.out.println(ExpressionEvaluator.eval(resultStr));
  24. }
  25. }

输出结果如下:

3.0
14.0
15.0
5.0
8.0
1.0
-4.0

例子2:

  1. public class Test2 {
  2. public static void main(String[] args){
  3. String s1 = "(1 + 2) == 3";
  4. System.out.println(ExpressionEvaluator.eval(s1));
  5. String s2 = "(20 - 6) < 3";
  6. System.out.println(ExpressionEvaluator.eval(s2));
  7. String s3 = "(3 + 1) == 4 && 5 > (2 + 3)";
  8. System.out.println(ExpressionEvaluator.eval(s3));
  9. String s4 = "\"hello\" == \"hello\" && 3 != 4";
  10. System.out.println(ExpressionEvaluator.eval(s4));
  11. String s5 = "\"helloworld\" @ \"hello\" &&  \"helloworld\" !@ \"word\" ";
  12. System.out.println(ExpressionEvaluator.eval(s5));
  13. }
  14. }

输出结果如下:

true
false
false
true
true

而在实际使用的过程中,通常需要在界面上配置,配置的时候可能是如下的样子:

【字段一】包含 “helloword” 并且 【字段二】 不等于 “hello"

当这个表达式在使用的时候,通常需要有一步转换的工作,在调用表达式解析的时候,首先需要把在前台定义好一种解析的格式规则,然后前台用户根据规则输入的合法的表达式,到后台时首先转换成表达式解析能识别的格式,然后在交给表达式解析工作解析。

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

基于Java的简易表达式解析工具(一)的更多相关文章

  1. 基于Java的简易表达式解析工具(二)

    之前简单的介绍了这个基于Java表达式解析工具,现在把代码分享给大家,希望帮助到有需要的人们,这个分享代码中依赖了一些其他的类,这些类大家可以根据自己的情况进行导入,无非就是写字符串处理工具类,日期处 ...

  2. java后台常用json解析工具问题小结

    若排版紊乱可查看我的个人博客原文地址 java后台常用json解析工具问题小结 这里不细究造成这些问题的底层原因,只是单纯的描述我碰到的问题及对应的解决方法 jackson将java对象转json字符 ...

  3. 基于Java的四大开源测试工具

    摘要:成功的应用程序离不开测试人员和QA团队反复地测试,应用程序在进行最后的部署之前,需要通过测试来确保它的负载管理能力以及在特殊情况下的工作条件和工作加载情况. %R[)vA t]N0 测试是应用程 ...

  4. 你必须掌握的Java基础:JSON解析工具-json-lib

    一.简介  json-lib是一个Java类库,提供将Java对象,包括beans,maps,collections,java arrays和xml等转换成JSON,或者反向转换的功能. 二.准备 在 ...

  5. JSON语言规范与Java中两种解析工具基本使用

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6652250.html  一:JSON语言规范 一言以蔽之:“一个 :一个键值对,一个{}一个对象,一个[]一个 ...

  6. Java爬虫利器HTML解析工具-Jsoup

    Jsoup简介 Java爬虫解析HTML文档的工具有:htmlparser, Jsoup.本文将会详细介绍Jsoup的使用方法,10分钟搞定Java爬虫HTML解析. Jsoup可以直接解析某个URL ...

  7. Java数学表示式解析工具- jeval

    这个包能够为我们提高高效的数学表达式计算. 举个样例:这个是我们策划给出的游戏命中率的一部份计算公式 是否命中=a命中率 – (b等级 – a等级) * (命中系数(6)* b闪避率 / 100)+3 ...

  8. java 之 xml 之解析工具jaxp

    一.jaxp的api查看 *jaxp是javase一部分 *jaxp解析器在jdk的javax.xml.parsers包里面 *共四个类:分别针对dom和sax解析使用的类 *dom解析类: Docu ...

  9. 基于java的简易计算器实现

    方法: 1.将string类型的表达式输入转换成后缀表达式 2.计算后缀表达式 步骤一:将string类型的表达式输入转换成后缀表达式 输入字符串表达式,并将表达式转换成char型数组 String ...

随机推荐

  1. Delphi XE5 图解为Android应用制作签名

    http://redboy136.blog.163.com/blog/static/107188432201381872820132 Delphi XE5 图解为Android应用制作签名 2013- ...

  2. linux系统编程之文件与IO(六):实现ls -l功能

    本文利用以下系统调用实现ls -l命令的功能: 1,lstat:获得文件状态, 2,getpwuid: #include <pwd.h> struct passwd *getpwuid(u ...

  3. winform 批量控件取值赋值

    以前写winform 最多写几个文本框,最近需要入录一个人员信息,那好几十个字段,一下子干蒙了,这要是一个个取值赋值都写到明天了,于是就自己写了个方法,也不是什么高大上的,就是很简单很普通很low的方 ...

  4. C++ STL的容器类型

    1.顺序容器 2.关联容器 3.vector的使用 vector<数据类型> a; a.push_back(10)  -------->把数据从末末尾段插入vector里面 a.po ...

  5. BZOJ 1008--[HNOI2008]越狱(容斥&快速幂)

    1008: [HNOI2008]越狱 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 12593  Solved: 5439[Submit][Status ...

  6. php批量导出pdf文件的脚本(html-PDf)

    背景:突然有大量的文件需要导出成PDF文件,写一个批量导出pdf的脚本,同时文件的命名也需要有一定的规则 导出方式:向服务器中上传csv文件,csv文件中包含文件的地址和相对应的文件命名. 如下格式: ...

  7. [AIR] AIR程序调用本地默认应用程序打开本地文件

    摘要:      File类提供了一个方法openWithDefaultApplication可以用本地默认应用程序打开指定路径下的文件. 当我用下面语句的时候,可以成功打开桌面文件夹下面的文件: v ...

  8. 解决onclick事件的300ms延时问题

    首先是资源的下载:fastclick.js 作为一个新手,插件原理什么的研究不透,看的也是似懂非懂的,网上有很多大牛写的博文相当的好,对于写文章方面确实是望尘莫及啊,所以想详细了解原理的朋友直接去大牛 ...

  9. 使用命令行创建一个vue项目的全部命令及结果

    dell@DESKTOP-KD0EJ4H MINGW64 /f/05 项目 $ npm install --global vue-cli npm WARN deprecated coffee-scri ...

  10. 【LOJ 2542】【PKUWC2018】 随机游走(最值反演 + 树上期望dp)

    哇我太菜啦555555 不妨钦定我们需要访问的点集为$S$,在$S$已知的情况下,我们令$f(x) $表示从$x$走到点集$S$中任意一点的期望步数. 若$x∈S$,则显然$f(x)=0$,否则$f[ ...