原文链接:http://www.geek-make.com/%E9%A3%8E%E6%8E%A7/%E5%9F%BA%E4%BA%8Egroovy%E5%AE%9E%E7%8E%B0%E7%9A%84%E5%A4%8D%E6%9D%82%E5%B8%83%E5%B0%94%E8%A1%A8%E8%BE%BE%E5%BC%8F%E8%A7%84%E5%88%99%E5%BC%95%E6%93%8E/
作者:Posted by 拜占庭 on 2020-08-13
_
groovy-bool-rule
groovy-bool-rule是一款开源的用于计算复杂布尔表达式的规则引擎,使用groovy动态脚本引擎设计与实现。
github: https://github.com/JavaPentesters/groovy-bool-rule
1、基于groovy实现的复杂布尔表达式规则引擎
在规则引擎决策中,规则往往涉及到多个复杂布尔表达式条件的逻辑计算。
条件(condition)通过或与非逻辑运算符组合成复杂的布尔表达式。这类布尔表达式有两种特点:一是条件及表达式是动态可配置的;二是表达式是条件的组合,所以相对是比较复杂的。
本项目基于groovy动态脚本引擎实现了计算复杂性布尔表达式的规则引擎。
1.1 规则与条件模型
Drools规则引擎中定义的规则包含两个部分:LHS(Left Hand Side)和RHS(Right Hand Side),一条规则可以抽象成if-then语句。
| 12 | when |
|---|---|
一条规则也可以理解为包含多个条件的复杂布尔表达式, 其中每一个条件执行的结果要么是true,要么是false。
规则中的条件可以简化为三个部分: “左变量”、”操作符”、”右变量”。比如,某个用户的登陆次数大于10次。
用户的登陆次数就是左变量,”大于”就是,登陆次数的阈值10次就是右变量。
| 1 | 用户的登陆次数> 10次 |
|---|---|
例如,某个具体的规则:
| 1 | boolean result = exp1 | exp2 && (exp3 | exp4) | ||
|---|---|---|---|---|---|
其中每一条条件exp1、exp2、exp3、exp4的形式可能如下:
| 1234 | exp1 = var1 > 5exp2 = var2 < 5exp3 = var3 != “北京”exp4 = var4 >= 20 |
|---|---|
为方便规则的计算,我们将规则简化成:
| 1 | boolean result = 1 | 2 && (3 | 4) | ||
|---|---|---|---|---|---|
从1 || 2 && (3 || 4)可以看出,规则就是多个条件语句与或非的组合。
使用groovy使用上诉复杂布尔表达式时,可以提前将数字替换为在数字前增加前缀以便在groovy中执行以及计算:
| 1 | boolean result = e1 | e2 && (e3 | 44) | ||
|---|---|---|---|---|---|
示例代码:
| 123456789101112131415161718192021222324252627282930313233 | /* 字符串内所有数字前面增加前缀 @param str String 原字符串 @param prefix String 数字前面需要增加的前缀 @return String */public static String addPrefixBeforeNumber(String str, String prefix) { StringBuilder result = new StringBuilder(); boolean isChar = false; StringBuilder sb = new StringBuilder(); for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if (c >= ‘0’ && c <= ‘9’) { sb.append(str.charAt(i)); if (i == str.length() - 1) { sb.setLength(0); } isChar = false; } else { if (sb.length() > 0 && isChar == false) { result.append(prefix).append(sb.toString()); sb.setLength(0); } result.append(c); isChar = true; } } return result.toString();} |
|---|---|
规则的运算操作支持数值运算和字符串运算两大类:
数值运算操作符 | 序号 | 符号 | 说明 | | :—- | :—- | :—- | | 1 | == | 等于 | | 2 | > | 大于 | | 3 | < | 小于 | | 4 | >= | 大于等于 | | 5 | <= | 小于等于 | | 6 | != | 不等于 |
字符串运算操作符 | 序号 | 符号 | 说明 | | :—- | :—- | :—- | | 1 | CONTAINS | 包含 | | 2 | NOT_CONTAINS | 不包含 | | 3 | EQUAL_IGNORE_CASE | 不区分大小写的字符串等于 | | 4 | STRING_EQUAL | 字符串相等 | | 5 | NOTSTRING_EQUAL | 字符串不等 | | 6 | NOT_EQUAL_IGNORE_CASE | 不区分大小写的字符串不等 | | 7 | MATCHES | 正则匹配 | | 8 | NOT_MATCHES | 正则不匹配 |
1.2 Reference
- 1、What about == in Groovy?
https://objectpartners.com/2018/11/07/equals-is-compareto-and-the-groovy-identity-operator/Behaviour of == In Java == means equality of primitive types or identity for objects. In Groovy == translates to a.compareTo(b)==0, if they are Comparable, and a.equals(b) otherwise.
