最近需要用到相关表达式解析的工具,然后去网上搜索,找到了一个用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. [LeetCode] Climbing Stairs (Sequence DP)

    Climbing Stairs https://oj.leetcode.com/problems/climbing-stairs/ You are climbing a stair case. It ...

  2. Git小技巧:VIM中如何填写注释信息

    使用Git命令行工具的时候,经常一不小心就进入VIM界面,例如git commit没有填写任何描述信息.对于习惯了Windows可视化操作界面的用户,可能一下子会觉得无所适从,只能在键盘上一顿短按.下 ...

  3. Javascript设计模式理论与实战:状态模式

    在软件开发中,很大部分时候就是操作数据,而不同数据下展示的结果我们将其抽象出来称为状态,我们平时开发时本质上就是对应用程序的各种状态进行切换并作出相应处理.状态模式就是一种适合多种状态场景下的设计模式 ...

  4. linux系统编程之信号(五):信号集操作函数,信号阻塞与未决

    一,信号集及相关操作函数 信号集被定义为一种数据类型: typedef struct { unsigned long sig[_NSIG_WORDS]: } sigset_t 信号集用来描述信号的集合 ...

  5. vim基本命令速查表

    来源:https://github.com/skywind3000/awesome-cheatsheets/blob/master/editors/vim.txt ################## ...

  6. C# 使用ftp下载一个文件夹下的所有文件,包括子目录文件夹

    这篇博客给大家补充一个方法,就是得到一个目录下的所有文件名称.在前端调用,大家写一个递归去遍历就可以了,我在这里就不在写了.具体ftp下载的方法在我的另一篇博客里有,需要的可以去看一下. /// &l ...

  7. ruby,gem,rails之间的关系

    Q:ruby,gem,rails之间的关系? 简单点说:Ruby是一种脚本语言,Gem是基于Ruby的一些开发工具包,Rails也算是一组Gem,专门用来做网站的.不同的Gem可能会依赖不同的Ruby ...

  8. C# GDI绘制仪表盘(纯代码实现)

    纯代码实现GDI绘制仪表盘,效果在代码下面. public partial class HalfDashboardUc : UserControl { /// <summary> /// ...

  9. WPF 获取表格里面的内容

    DataRowView dataRow = DataGridCase.SelectedItem as DataRowView; 代码转为数组分别获取.

  10. Day 15 内置函数 , 匿名函数.

    1. 最大值 max,最小值# #最大值 ret = max(1,2,-3)print(ret)# 结果 2ret=max([1,2,3,4])print(ret)# 结果 4 2.sum 函数用法 ...