悠悠楠杉
网站页面
正文:
在软件开发中,布尔逻辑表达式广泛应用于规则引擎、条件过滤等场景。然而,当这些表达式以字符串形式(如 "a > 1 && b < 2 || c == 3")从外部输入时,如何高效校验其语法有效性成为关键问题。本文将介绍几种在Java中实现布尔表达式校验的实用方法。
对于简单表达式,可通过正则表达式快速验证基本结构。例如,校验是否包含合法逻辑运算符(&&, ||, !)和操作数:
public static boolean isValidByRegex(String expr) {
String pattern = "^[\\s\\w> 0;
}
此方法虽快速,但无法处理嵌套括号或复杂运算符优先级,适合对输入做初步过滤。
更严谨的做法是构建语法树。使用javax.script.ScriptEngine模拟执行验证:
public static boolean isValidByScriptEngine(String expr) {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
try {
engine.eval("var result = " + expr + ";");
return true;
} catch (ScriptException e) {
return false;
}
}
此方案能识别更复杂的语法错误,但需注意性能开销和安全风险(如恶意代码注入)。
对于高性能场景,可基于逆波兰算法实现轻量级解析:
public static boolean isValidCustom(String expr) {
try {
Stack stack = new Stack<>();
String cleanExpr = expr.replaceAll("\\s", "");
for (char c : cleanExpr.toCharArray()) {
if (c == '(') stack.push(c);
else if (c == ')') {
if (stack.isEmpty() || stack.pop() != '(')
return false;
}
// 扩展运算符校验逻辑...
}
return stack.isEmpty();
} catch (Exception e) {
return false;
}
}
该方法需补充运算符优先级处理,但避免了外部依赖。
通过组合上述方法,开发者可构建适应不同场景的校验体系,平衡准确性与性能。实际应用中,建议根据输入复杂度选择方案——简单配置可使用正则,关键业务逻辑推荐语法树验证。