是否有一种简单的方法可以使用诸如“5 * 4”之类的字符串并返回20?
答案 0 :(得分:6)
最简单的方法是使用JRE 6标准API提供的Rhino JavaScript engine。
编辑根据评论,如果字符串是用户提供的,这可能是一个潜在的安全漏洞。一定要过滤除数字,大括号和数学运算符以外的所有内容。
答案 1 :(得分:3)
您可能正在寻找类似JbcParser - Math Parser for Java的内容。
答案 2 :(得分:3)
我不知道哪些是最好的,但有“数学表达式评估器”包。
查看Java Math Expression Evaluator(包含one file源代码)
网站使用示例:
java -cp meval.jar com.primalworld.math.MathEvaluator -cos(0)*(1 + 2)
java -cp meval.jar com.primalworld.math.MathEvaluator 0.05 * 200 + 3.01
答案 3 :(得分:2)
有关表达评估的更多详细信息,请访问:
答案 4 :(得分:2)
我搜索了一下,发现一个here。它不完全是你所需要的,但也许它有助于实现这一点。
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class ScriptDemo {
public static void main(String[] args) {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
engine.put("a", 1);
engine.put("b", 2);
try {
String expression = "(a + b) > 2";
Object result = engine.eval(expression);
System.out.println(expression+" ? "+result);
} catch(ScriptException se) {
se.printStackTrace();
}
}
}
答案 5 :(得分:2)
听起来你应该看看JEXL(Java表达式语言)
非常易于使用;例如,您的问题的解决方案是:
public static void main(String[] args) {
long a = 5;
long b = 4;
String theExpression = "a * b";
JexlEngine jexl = new JexlEngine();
Expression e = jexl.createExpression(theExpression);
JexlContext context = new MapContext();
context.set("a", a);
context.set("b", b);
Long result = (Long) e.evaluate(context);
System.out.println("The answer : " + result);
}
或者,如果直接读取字符串,则可以使用以下内容:
public static void main(String[] args) {
JexlEngine jexl = new JexlEngine();
Expression e = jexl.createExpression("5 * 4");
Integer result = (Integer) e.evaluate(null);
System.out.println("The answer : " + result);
}
答案 6 :(得分:1)
最好使用图书馆。 Janino能够评估任意Java表达式,例如您指定的Java表达式,以及更多。
查看ExpressionEvaluator示例。
答案 7 :(得分:1)
您可以尝试使用Integer.parseInt()并使用switch()语句自行解析它来查找运算符。
您也可以尝试使用javax.script.ScriptEngine;有关详细信息,请参阅http://forums.sun.com/thread.jspa?threadID=5144807。
答案 8 :(得分:1)
您也可以使用BeanShell
它实际上是一个Java源代码解释器,但最近我用它来评估一些包含变量的表达式(只有eval
方法使用BeanShell, rest 用于准备输出):< / p>
import bsh.EvalError;
import bsh.Interpreter;
public class EVAL {
private static final String FORMAT = "%-5s | %-5s | %-5s | %s%n";
public static void main(String[] args) {
tabela("((a && b)||c)");
tabela("a ? (b || c) : (b && c)");
tabela("(a?1:0) + (b?1:0) + (c?1:0) >= 2");
}
private static void tabela(String expressao) {
System.out.printf(FORMAT, " a ", " b ", " c ", expressao);
System.out.printf(FORMAT, "-----", "-----", "-----", expressao.replaceAll(".", "-"));
try {
for (int i = 0; i < 8; i++) {
boolean a = (i & (1<<2)) != 0;
boolean b = (i & (1<<1)) != 0;
boolean c = (i & (1<<0)) != 0;
boolean r = eval(expressao, a, b, c);
System.out.printf(FORMAT, a, b, c, r);
}
} catch (EvalError ex) {
ex.printStackTrace();
}
System.out.println();
System.out.println();
}
private static boolean eval(String expressao, boolean a, boolean b, boolean c) throws EvalError {
Interpreter inter = new Interpreter();
inter.set("a", a);
inter.set("b", b);
inter.set("c", c);
Object resultado = inter.eval(expressao);
return (Boolean) resultado;
}
}
结果:
a | b | c | ((a && b)||c)
----- | ----- | ----- | -------------
false | false | false | false
false | false | true | true
false | true | false | false
false | true | true | true
true | false | false | false
true | false | true | true
true | true | false | true
true | true | true | true
a | b | c | a ? (b || c) : (b && c)
----- | ----- | ----- | -----------------------
false | false | false | false
false | false | true | false
false | true | false | false
false | true | true | true
true | false | false | false
true | false | true | true
true | true | false | true
true | true | true | true
a | b | c | (a?1:0) + (b?1:0) + (c?1:0) >= 2
----- | ----- | ----- | --------------------------------
false | false | false | false
false | false | true | false
false | true | false | false
false | true | true | true
true | false | false | false
true | false | true | true
true | true | false | true
true | true | true | true
答案 9 :(得分:1)
我过去曾使用JEval,并且发现它非常简单直观。这是一段代码:
import net.sourceforge.jeval.EvaluationException;
import net.sourceforge.jeval.Evaluator;
public class Main {
public static void main(String[] args) {
try {
System.out.println(new Evaluator().evaluate("5+4*3"));
}
catch (EvaluationException e) {
e.printStackTrace();
}
}
}
答案 10 :(得分:0)