介绍
假设我有一行字符串“34/2 + 52 * 2 + 3.45”如何将这行字符串转换并计算为一个双精度值?
一种方法是您可以使用ScriptEngine
该类并使用eval()
.
您必须使用ScriptEngineManager#getEngineByName("js")来加载 JS 解释器。
请记住,这是一项昂贵的操作。
更好的办法是编写一个使用 Stack 评估表达式的方法。如果所有操作都是二元操作,则可以通过首先将中缀表达式转换为后缀表示法来使用堆栈来查找中缀表达式的整体值。学习逆波兰符号。
最后,您可以查看一些第三方库。
通常这是由某种词法分析器/解析器完成的,它可以使用正则表达式(?)和编译器原理评估这种表达式。需要明确的是,您使用词法分析器将整个表达式分隔为标记,这是表达式的最小有效单元,然后使用解析器整体评估这些标记的含义并获得结果。
您可以在 Java 代码中使用 Javascript 脚本:
// create a script engine manager
ScriptEngineManager manager = new ScriptEngineManager();
// create a JavaScript engine
ScriptEngine jsEngine = manager.getEngineByName("JavaScript");
if (jsEngine !=null)
// evaluate expression from String
jsEngine.eval("print(34/2 + 52 * 2 + 3.45)");
else
System.err.println("JavaScript is not available");
输出:
124.45
你有几个选择(这些不是全部,只是我脑海中的那些): 1. 用正则表达式分析它。如果您了解它们,这是理想的选择。2.将其分解为子串,将这些子串转换为数字和符号,并编写一个函数,将整个事情按照运算顺序变成正确的答案。3. 调用 ScriptEngine 并使用诸如 JavaScript 的内置解析器功能之类的语言来执行操作。迂回,但有效。