使用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
相关产品推荐
相关产品推荐

