首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一个轻量的条件表达式引擎-JExpr Engine

一个轻量的条件表达式引擎-JExpr Engine

作者头像
吴就业
发布2022-03-29 09:12:30
7340
发布2022-03-29 09:12:30
举报
文章被收录于专栏:Java艺术Java艺术

由于需求缘故,笔者最近开发了一个IDEA的代码扫描插件,在这过程中,发现规则匹配虽通过设计模式实现,但发现规则的代码大多相似,可以说重复,除了配置不同。因此想抽离成配置方式扩展功能,而使用规则引擎感觉又太重,这就需要一个条件表达式匹配引擎,这个简单的表达式引擎由此而来。

实现思路参考自:https://www.codenong.com/20763189/。此文章实现的表达式匹配较为粗糙,但原理可借鉴。

笔者开源的jexpr借鉴这篇文章的实现原理,并优化了表达式的写法,扩展实现了sql where所支持的表达式,支持"()"优先级,虽然简单,但也算一个比较完善且轻量的条件表达式引擎。

GitHub:https://github.com/wujiuye/jexpr-engine (帮忙点颗小星星哟)

实现原理无非就是利用递归与回溯算法,再加上栈数据结构实现优先级。

表达式引擎支持的运算符:

  • 关系运算符:=,!=,>,>=,<,<=,in,is null,is not null
  • 逻辑运算符:and ,or,not(逻辑与或非)

支持组合与优先级:

  • not in可通过逻辑运算符not+关系运算符in实现
  • is not null也可通过逻辑运算符not+关系运算符is null实现
  • 支持(),优先级从左到右,()里面的优先,()与()之间,也是从左到右,符合正常数学层面理解的优先级

表达式书写要求:

  • 字符串必要使用"'"开始,"'"结束
  • in后面必须带括号
  • and、or、not、in、is null、is not null左右两边至少要有一个空格
  • and、or、not、in、is null、is not null不区分大小写

关系运算符简单使用:

a='jexpn'
a!='jexpn'
a>0
a>=0
a<1
a<=1
a in (1,2,3)
a in (1.0,2.0,3.0)
a in ('java','expr','engine')
a is null
a is not null

关系运算符与逻辑运算符混合使用:

a>0 and a<10
a<10 or a>100
not a=100
a>0 and not a=10
a>0 and a<100 and c=1 or d=0

加入优先级的复杂使用:

a='123' AND b!='123' OR (c='aa' AND d='ff')
(a>0 and a<10) or (b>10 or b<10) or not (c<0 and c>-100)
(a>0 and a<12) or (b>10 or b<10) or not (c<0 and c>-100)
(a>0 and a<10) or b=10 or not (c<0 and c>-100)
(a>0 and a<10) or (b>10 or b<10) or not (c<0 and c>-10)

使用方式:

/**
 * @author wujiuye
 */
public class ExpressionParserTest {

    public static void main(String[] args) {
        // 解析表达式
        Expression expr = ExpressionParser.fromString("(a>0 and a<10) or (b>10 or b<10) or not (c<0 and c>-100)");
        // 设置变量值
        Map<String,Object> bindings = new HashMap<>();
        bindings.put("a", 11);
        bindings.put("b", 10);
        bindings.put("c", -10);
        // 匹配
        boolean triggered = expr.interpret(bindings);
        System.out.println("匹配结果:" + triggered);
    }

}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-01-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java艺术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云代码分析
腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档