繁体   English   中英

检查字符串是否为数学表达式?

[英]Check if a string is a mathematical expression or not?

我正在尝试用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)有简单的实现吗? 可能使用一些正则表达式? 请让我知道是否有。 谢谢

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

我建议您只是尝试评估,如果失败,则抛出特定于域的异常,说出CannotEvaluateFormulaException并捕获它。

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

答:不可以。

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

建议:

调用您的引擎,并捕获所有异常。

PS:

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

也许可以编写一个正则表达式来检查此内容,但这将是一个非常漫长而复杂的过程。 通常,您可能会递归地进行分析,当某项不适合时,在表达式的某些子部分中,您将抛出异常。

只要捕获异常,就不要丢耻,这就是它们的目的! 当然,抛出和捕获异常会产生一些开销,但是您必须根据您的初始预检查来评估该异常,该检查将针对所有表达式(无论是否正确)运行。

也就是说,如果没有人提供更好的现成建议,请查看解释器模式以评估您的表达式,尤其是如果您具有普通的普通数学表达式而没有自定义扩展名/逻辑/其他内容(请查看@ user1264811解决方案) !)

您需要尝试并抓住。

参考异常处理

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM