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

使用JEP解析带花括号占位符表达式返回null问题咨询

问题原因

JEP库默认的变量命名规则仅支持由字母、数字、下划线组成的变量名,不支持包含{、}等特殊字符的变量名。当你传入表达式{x}/5时,JEP无法将{x}识别为已注册的变量,会判定为无效语法,最终返回null。

解决方案

方案1:表达式与变量名预处理(推荐)

实现成本最低、兼容性最好,适配你提到的{{value}}格式占位符场景:

  • 先对从数据库读取的表达式做特殊符号清理,将所有{{和}}占位符标记删除,例如将{{value}}/10转换为value/10
  • 注册变量时直接使用清理后的纯字符变量名,无需携带{}符号
  • 调用解析方法即可返回正确结果

示例代码:

// 从数据库拿到的原始表达式
String rawExp = "{{x}}/5";
// 清理占位符标记
String processedExp = rawExp.replaceAll("\\{\\{|}}", "");
// 注册变量
jep.addVariable("x", 9);
// 解析执行
jep.parse(processedExp);
Object result = jep.evaluate(); // 正确返回1.8

方案2:自定义JEP变量识别规则

如果业务要求必须保留表达式中的{}符号,可以修改JEP的符号解析器配置,放开变量名允许的字符范围:

  • 重写JEP的IdentifierParser类,修改isValidIdentifierStart和isValidIdentifierPart方法,允许{、}作为变量名的合法字符
  • 初始化JEP时使用自定义的标识符解析器
  • 注册变量时直接使用带{}的变量名即可

示例代码片段:

// 自定义标识符解析器
public class CustomIdentifierParser extends StandardIdentifierParser {
    @Override
    public boolean isValidIdentifierStart(char c) {
        return super.isValidIdentifierStart(c) || c == '{';
    }

    @Override
    public boolean isValidIdentifierPart(char c) {
        return super.isValidIdentifierPart(c) || c == '}';
    }
}

// 初始化JEP时指定自定义解析器
Jep jep = new Jep(new CustomIdentifierParser());
// 注册带{}的变量
jep.addVariable("{x}", 9);
// 解析原始表达式
jep.parse("{x}/5");
Object result = jep.evaluate(); // 正确返回1.8
注意事项
  • 方案2需要注意避免{}和JEP其他语法规则冲突,如果表达式中还包含其他用{}包裹的语法元素,会出现识别异常
  • 如果使用JEP 4以上版本,自定义标识符解析器的API会有微调,对应调整方法实现即可

内容的提问来源于stack exchange,提问作者Rakshan Premsagar Kapikad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 19:15:03