2

我正在尝试用 Java 编写一个接受字符串作为参数的方法。现在这个字符串可能是一个数学表达式,也可能只是一个普通的字符串。只有当它是一个数学表达式时,我才必须对其进行评估,如果不是,则不要理会它。我将使用 java 脚本引擎评估数学表达式,如下所示:

ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
String foo = "1+2*10";
System.out.println(engine.eval(foo));

但问题是,如果我传递一个不是数学表达式的字符串,则会引发异常。我不想在我的代码中出现异常。我想要实现的是这样的:

if(isExpression(foo))
{
engine.eval(foo);
}

这样我在评估它之前检查它是否是一个数学表达式。isExpression(foo) 方法有简单的实现吗?可能正在使用一些正则表达式?如果有的话请告诉我。谢谢

4

5 回答 5

7

对于像这样非常复杂的操作,查看它是否是有效公式的努力几乎与实际进行评估的努力一样多。

我建议您只尝试评估,并在失败时抛出特定于域的异常,例如CannotEvaluateFormulaException,然后捕获它。

于 2012-06-22T16:23:58.083 回答
4

问:是否有一个内置的 Java 函数来评估1+2*10一个表达式,AB@C#!不是吗?

答:没有。

使用正则表达式可能会让您很接近,但是在您确定它是否真的是算术表达式之前,需要有人解析并尝试评估该字符串。

建议:

调用你的引擎,并捕获任何异常。

PS:

无论如何,您都应该这样做,与“有效表达/非表达”无关。正确的?

于 2012-06-22T16:24:55.250 回答
3

也许可以编写一个正则表达式来检查它,但这将是一个非常长且复杂的正则表达式。你通常做的是解析,也许是递归的,当有些东西不适合时,在表达式的某个子部分深处,你抛出一个异常。

只要你抓住它们,抛出异常就没有什么可耻的,这就是它们的用途!当然,抛出和捕获异常会有一些开销,但是您必须根据初始预检查来评估它,这将对所有表达式运行,无论是否正确。

也就是说,如果没有人有更好的现成建议,请查看解释器模式来评估您的表达式,特别是如果您有普通的数学表达式而没有自定义扩展/逻辑/任何东西(例如查看 @user1264811 解决方案!)

于 2012-06-22T16:23:52.553 回答
2

你需要试一试。

参考异常处理

于 2012-06-22T16:24:47.090 回答
1

如果您想制作某种计算器,您可能想检查一下:users.cis.fiu.edu/~weiss/dsj2/code/Evaluator.java

于 2012-06-22T16:23:48.683 回答