规则引擎(一)
因为自己接触的项目做的是一个风控系统,涉猎到了规则,流程等知识,转眼一年多了,也没咋回顾这块知识点,今天就总结下规则引起这块的知识点,本文重点讲解用到的表达式相关的算法的逻辑。
一 表达式和操作符
我们日常计算,或者看到的数学运算表达式,都是中缀表达式 ,看起来是这样的:(1 + 2) * 3 + 4,其中,加减乘除这些符号就叫操作符,不过,这样的表达式,不过这样的表达式对于计算机并不好识别,我们可以回顾下,算法中的三种表达式的特点:
1 表达式
前缀、中缀和后缀表达式都是用来表示数学表达式的方式,它们的主要区别在于运算符的位置。
- 前缀表达式(也称为波兰表达式):运算符位于操作数之前。例如,表达式 “2 + 3” 的前缀表示为 “+ 2 3”。
- 中缀表达式:运算符位于操作数之间。这是我们通常使用的方式,例如,表达式 “2 + 3” 就是中缀表达式。
- 后缀表达式(也称为逆波兰表达式):运算符位于操作数之后。例如,表达式 “2 + 3” 的后缀表示为 “2 3 +”。
为了更好地理解这些表达式之间的区别,让我们以一个简单的表达式为例:”(4 + 5) * 6”。
- 中缀表达式:(4 + 5) * 6
- 前缀表达式: + 4 5 6
- 后缀表达式:4 5 + 6 *
可以看到,中缀表达式需要使用括号来表示运算符的优先级,而前缀和后缀表达式通过运算符的位置来明确表达式的结构和运算顺序。
对于计算机来说,后缀表达式在求值时更容易处理,因为它不需要括号和优先级的考虑。因此,在编写计算机程序或使用栈数据结构进行表达式求值时,通常会将中缀表达式转换为后缀表达式来简化计算过程。
2 操作符
操作符又分为两种:逻辑操作符和算术操作符,逻辑操作符用于执行逻辑运算,主要用于布尔逻辑(真和假的逻辑值)的计算。以下是常见的逻辑操作符:
- 逻辑与(AND):表示为 “&&” 或 “and”,用于判断多个条件是否同时成立。如果两个条件都为真,则结果为真,否则为假。
- 逻辑或(OR):表示为 “||” 或 “or”,用于判断多个条件中至少有一个是否成立。如果任何一个条件为真,则结果为真,只有当所有条件都为假时结果才为假。
- 逻辑非(NOT):表示为 “!” 或 “not”,用于对一个条件的逻辑值进行取反。如果条件为真,则结果为假,如果条件为假,则结果为真。
算术操作符用于执行数学运算,用于处理数值和执行各种数学计算。以下是常见的算术操作符:
- 加法(Addition):表示为 “+”,用于将两个数值相加。
- 减法(Subtraction):表示为 “-“,用于从一个数值中减去另一个数值。
- 乘法(Multiplication):表示为 “*”,用于将两个数值相乘。
- 除法(Division):表示为 “/“,用于将一个数值除以另一个数值。
- 取模(Modulus):表示为 “%”,用于计算两个数值相除后的余数。
- 幂运算(Exponentiation):表示为 “^”,用于将一个数值提升到指定的幂次方。
二 中缀表达式转为后缀表达式
工作中会常见到这样的需求:页面配置一个复杂的规则,比如:!A||B&&(C||D) ,存储起来,在使用的时候填充不同的值之后进行运算,这个时候就需要将上述的中缀表达式做转换,变为后缀表达式进行后续运算操作。
这个算法的核心如下:
创建一个栈和一个存储结果的字符串,栈用来存放操作符,结果用于拼接数字和操作符。然后从左到右遍历表达式,算法有这样的规则:
- 遇到左括弧( 入栈
- 遇到右括弧) 循环出栈,直到遇到相匹配的左括弧,将出栈符号拼接到结果字符串
- 遇到符号,循环出栈,将优先级大于等于当前符号的操作符出栈,遇到小于当前符号的操作符停止循环,将出栈符号拼接到结果字符串,最后将当前符号入栈
- 遇到字符,则拼接到结果的字符串
- 当表达式循环结束时,将站内的全部符号依次取出并且拼接到结果的字符串
java实现代码,参考:github代码
过程示例图如下:

三 后缀表达式如何使用
上面的算法,我们已经得到了一个后缀表达式,这个表达式的运算逻辑是怎样的呢?我们一起来看下:
我们需要一个栈来存放所有的操作数,从左到右遍历符号,具体运算规则如下:
- 遇到操作数,则入栈
- 遇到操作符,则出栈两个操作数进行计算,将计算的结果继续入栈
下面以算术表达式为例,一个整体的运算流程如下:

这样很方便的就实现了一个复杂算术表达式的运算,而逻辑表达式也是一样运算方式,比如||,&& 唯一区别就是每次去出两个字符。
具体在规则引擎中如何使用,请听下次讲解。
- 标题: 规则引擎(一)
- 作者: chalmery
- 创建于 : 2023-07-09 00:00:00
- 更新于 : 2023-07-09 00:00:00
- 链接: https://github.com/chalmery/4078686809/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。