首页 > 解决方案 > 如何取出包含数学表达式的字符串的某些部分并给出结果

问题描述

我正在为一个不和谐的机器人制定一个命令:
有人键入/calc (some-math-expression),例如。/calc 4+5.
我想评估4+5并显示答案。为此,我相信我必须'4+5'从字符串中取出,计算它,然后返回答案。我该怎么做?

我试过这样做,这可能很愚蠢,我是新手。(我正在使用else if,因为我有机器人的其他输入)

else if (message.content === '/calc' + exp) {
    return Number(exp);
}

显然,这并没有将 分配给我之前定义'(some-math-expression)'的var 。 机器人没有显示输出。exp

有没有一种方法可以将字符串拆分成/calc其他我可以自动分配给变量的方法?

谢谢!

标签: javascriptnode.jsdiscord.js

解决方案


虽然这个答案可行,但这可能会被恶意使用:代码将运行字符串中的所有内容,因此如果有人编写了正确的内容,他们可以将代码插入机器人,使其容易受到攻击。例如,他们可以使用 关闭它/calc client.destroy()或读取它的令牌/calc client.token:最好不要让eval命令公开访问。

取而代之的是,我会使用更安全的方法,使用mathjs包。 新PM

您可以按照其他答案中的说明解析表达式,然后使用math.eval()它来解析表达式。您可以在此处找到文档。

这是一个简单的例子:

var mathjs = require("mathjs");

let cmdString, mathExpression;

// This will just return the expression
function getExp(command = '') {
    return command.split('/calc')[1].trim();
}

cmdString = "/calc4+5"; // If this is the command...
mathExpression = getExp(cmdString); // ...this will be '4+5'
// Make the result with mathjs.eval()
let result = mathjs.eval(mathExpression); // 9

这是一种简单的方法,甚至可以处理更复杂的操作,例如sqrt()cos()。它还可以处理虚数和各种没有人会向 Discord 机器人询问的东西。

您可以使用 RunKit: link试用该软件包。


推荐阅读