zoukankan      html  css  js  c++  java
  • 基于Java的简易表达式解析工具(一)

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

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

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

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

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

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

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

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

    先来看看用法吧:

    例子1:

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

    输出结果如下:

    3.0
    14.0
    15.0
    5.0
    8.0
    1.0
    -4.0

    例子2:

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


    输出结果如下:

    true
    false
    false
    true
    true

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

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

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

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

  • 相关阅读:
    我的python菜鸟之路11
    我的SAS菜鸟之路9
    我的python菜鸟之路10
    idea中tomcat9打印日志乱码
    2、dockerfile命令
    1、Docker 打包本地镜像
    1、Centos7下MongoDB下载安装详细步骤
    4、自定义service 服务
    3、杀死某个服务下的多个进程
    3、python导出依赖环境时报错
  • 原文地址:https://www.cnblogs.com/csguo/p/7614875.html
Copyright © 2011-2022 走看看