如何取出包含数学表达式的字符串的某些部分并给出结果

How to take out some part of a string which contains a mathematical expression and give the result

我正在为 discord 机器人编写命令:
有人输入 /calc (some-math-expression),例如。 /calc 4+5.
我想评估 4+5 并显示答案。 为此,我相信我必须从字符串中取出 '4+5',计算它,然后 return 得到答案。 我该怎么做?

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

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

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

是否有一种方法可以将字符串拆分为 /calc 以及我可以自动分配给变量的其他内容?

谢谢!

解析输入的最简单方法是使用 String.split。那就是...

const words = message.content.split(' ');
const command = words[0];
const variables = words.splice(1).join(' ');

此处命令将变为“/calc”,变量将变为“4+5”

之所以可行,是因为在您需要 discord 机器人处理的任何输入中,第一个词始终是命令。

let message = '/calc 4+5'

let equation = message.replace(/\/calc/, '').trim();
let answer = eval(equation)
console.log(equation+' =', answer )

您可以使用以下正则表达式实现您的功能。

let message = '/calc 4+5'

if (equation = message.match(/^\/calc(.+)/)) {
 let answer =  eval(equation[1].trim());
 console.log(equation[1]+' =',answer)
}

我不确定您是如何获得 message.contentexp 的。但是,根据我的理解,您可以执行以下操作:

let cmdString = "/calc4+5";
let mathExpression = cmdString.split("/calc")[1];
let result = eval(mathExpression);

result 是表达式的结果值。

谢谢...

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

相反,我会使用更安全的方法,使用 mathjs 包。

您可以按照其他答案中所述解析表达式,然后使用 math.eval() 使其解析表达式。您可以找到文档 here.

这是一个简单的例子:

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