Flutter中如何解析并求值字符串形式的逻辑表达式
在Flutter中求值字符串形式的布尔表达式
要实现把字符串形式的逻辑表达式直接求值为布尔结果,有两种可行方案:
方案一:用第三方表达式求值库
可以用expr这类专门处理表达式求值的库,它支持字符串比较、逻辑运算、算术运算等常见场景,步骤如下:
- 在
pubspec.yaml里添加依赖:
dependencies: expr: ^1.0.0
- 导入库并编写求值代码:
import 'package:expr/expr.dart'; void main() { String expression = "'Cat' != 'Dog'"; final parser = ExpressionParser(); // 解析表达式并求值,转成布尔类型 bool result = parser.parse(expression).evaluate() as bool; print(result); // 输出true }
这个库能处理更复杂的表达式,比如"'Cat' == 'Cat' && 2 > 1"这类混合逻辑的场景,不用自己写复杂的解析逻辑。
方案二:自定义简易解析器(适合简单场景)
如果不想依赖第三方库,针对字符串的==、!=比较这类简单需求,可以自己写个轻量的解析函数:
bool evaluateSimpleStringExpr(String expression) { var expr = expression.trim(); List<String> parts; bool isNotEqual = false; // 判断表达式的运算符类型 if (expr.contains('!=')) { parts = expr.split('!='); isNotEqual = true; } else if (expr.contains('==')) { parts = expr.split('=='); } else { throw ArgumentError('仅支持==和!=的字符串比较表达式'); } // 提取两边的字符串,去掉引号和多余空格 String left = parts[0].trim().replaceAll(RegExp(r"'|\""), ''); String right = parts[1].trim().replaceAll(RegExp(r"'|\""), ''); // 返回比较结果 return isNotEqual ? (left != right) : (left == right); } // 使用示例 void main() { String expression = "'Cat' != 'Dog'"; bool result = evaluateSimpleStringExpr(expression); print(result); // true }
这种方式只针对特定场景,要是需要支持&&、||或者算术运算,就得扩展解析逻辑,处理运算符优先级、括号等,复杂度会高很多。
额外提示
如果表达式里有变量(比如"$pet != 'Dog'"),可以先把变量替换成实际值,再传入解析器求值。比如:
String pet = 'Cat'; String expression = "'$pet' != 'Dog'"; // 之后再用上面的方法求值
内容的提问来源于stack exchange,提问作者Nelson Chadali
相关产品推荐
相关产品推荐

