我正在尝试用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)实现?可能正在使用一些正则表达式?如果有的话请告诉我。感谢
答案 0 :(得分:5)
对于像这样的非常复杂的操作,查看它是否是有效公式的努力几乎与实际进行评估的努力一样多。
我建议您只是尝试评估,并在失败时抛出一个特定于域的异常,比如说一个CannotEvaluateFormulaException,然后抓住它。
答案 1 :(得分:3)
问:是否有内置的Java函数来评估1+2*10
是一个表达式,而AB@C#!
不是?
答:没有。
使用正则表达式可能会让你接近,但某人需要解析并尝试评估字符串,然后才能确定它是否真的是算术表达式。
建议:
调用引擎,并捕获任何异常。
PS:
无论如何,你应该这样做,独立于“有效表达/不表达”。正确的吗?
答案 2 :(得分:2)
也许有可能编写一个检查这个的正则表达式,但它将是一个非常漫长而复杂的。你通常做的是解析,也许是递归的,当某些东西不合适时,在表达式的某个子部分深处,你会抛出异常。
只要你抓住异常,就不会感到羞耻,这就是它们的用途!当然,抛出和捕获异常会有一些开销,但是你必须根据初始预检来评估,这将针对所有表达式运行,正确与否。
那就是说,看看Interpreter Pattern来评估你的表达式,如果没有人有更好的现成建议,特别是如果你有普通的普通数学表达式没有自定义扩展/逻辑/什么(检查例如@ user1264811解决方案!)
答案 3 :(得分:1)
你需要一个尝试并抓住。
答案 4 :(得分:0)
如果您想制作某种类型的计算器,您可能想要查看一下: users.cis.fiu.edu/~weiss/dsj2/code/Evaluator.java