Java中如何将包含逻辑语句的字符串转换为Boolean类型并求值
你之前使用的Boolean.parseBoolean、Boolean.valueOf只能处理值为纯"true"或"false"的字符串,无法解析包含逻辑运算符的复杂表达式,两种常用实现方案如下:
方案1:使用JDK自带的ScriptEngine解析(无需引入第三方依赖)
先将字符串中的HTML转义符&还原为逻辑与运算符&,再调用脚本引擎执行表达式得到布尔结果,示例代码如下:
import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; public class LogicExprEval { public static void main(String[] args) throws ScriptException { // 原表达式先替换转义的& String expr = "(true & false) | true".replace("&", "&"); ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("JavaScript"); // 执行表达式得到布尔结果 Boolean result = (Boolean) engine.eval(expr); if (result) { System.out.println("the equation is true"); } else { System.out.println("the equation is false"); } } }
注意:如果你的表达式来源不可信,这种方案存在脚本注入风险,建议使用第二种方案
方案2:自定义解析逻辑/使用轻量级表达式引擎(更安全)
如果要规避脚本注入风险,有两个可选方向:
- 自己手写递归下降解析器,仅识别
!、&、|、括号、true/false这几个有限的语法元素即可,逻辑复杂度不高,完全可控 - 引入专门的表达式解析库,比如SpEL、Apache Commons JEXL,仅开放布尔逻辑相关的语法权限,避免恶意代码执行
SpEL实现示例:
import org.springframework.expression.ExpressionParser; import org.springframework.expression.spel.standard.SpelExpressionParser; public class SpelEval { public static void main(String[] args) { String expr = "(true & false) | true".replace("&", "&"); ExpressionParser parser = new SpelExpressionParser(); Boolean result = parser.parseExpression(expr).getValue(Boolean.class); System.out.println(result); } }
内容的提问来源于stack exchange,提问作者Globhui
相关产品推荐
相关产品推荐

