You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何解析并求值字符串形式的逻辑表达式

在Flutter中求值字符串形式的布尔表达式

要实现把字符串形式的逻辑表达式直接求值为布尔结果,有两种可行方案:

方案一:用第三方表达式求值库

可以用expr这类专门处理表达式求值的库,它支持字符串比较、逻辑运算、算术运算等常见场景,步骤如下:

  1. 在pubspec.yaml里添加依赖:
dependencies:
  expr: ^1.0.0
  1. 导入库并编写求值代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 04:50:02