需求的由来:
后台将过滤的功能放到客户端来做
给定一个逻辑表达式,客户端本地做逻辑判断,例如给定一个表达式:expr = a && (b || c)
需要解决的问题
- 如何判断一个逻辑表达式的真假
- 如何对一个逻辑表达式求值
判断逻辑表达式的真假
首先解决小括号的匹配问题,主要步骤分为如下几步:
- 初始化一个栈,在OC中可借助数组来实现栈这种数据结构
- 将给定的表达式字符串转化成C语言的字符数组
- 遍历转换后的C语言字符数组
- 遇到左括号"(",入栈
- 遇到右括号")",出栈一个元素,如果栈为空或者出栈元素不是与之匹配的左括号"(",则判断括号不匹配
- 如果匹配,则继续遍历字符数组,按照4、5规则直到遍历完成
如果遍历结束都能匹配,表示小括号能正确匹配
再进行逻辑表达式的判断,如果给定的表达式没有混杂小括号的话,可以通过OC中的谓词结合正则表达式来判断,主要代码如下:
+ (BOOL)validRegexExpression:(NSString *)express {
NSString *regex = @"^[0-9A-Za-z]+(([&]{2}|[|]{2})[0-9A-Za-z]+)*$";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
return [predicate evaluateWithObject:express];
}
引入小括号之后,可以结合上述2种方式:
- 首先判断小括号是否匹配,匹配成功之后对其括号中间的

本文探讨了在客户端解析和求值逻辑表达式的方法,包括小括号匹配验证、正则表达式判断逻辑表达式合法性及求值过程。通过栈结构处理括号匹配,利用谓词与正则表达式验证表达式,最终实现复杂逻辑表达式的本地求值。
-iOS&spm=1001.2101.3001.5002&articleId=97499798&d=1&t=3&u=2d6df6a603184bc0b776c0db240e383f)
782

被折叠的 条评论
为什么被折叠?



