如何取出包含数学表达式并给出结果的字符串的某些部分
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何取出包含数学表达式并给出结果的字符串的某些部分相关的知识,希望对你有一定的参考价值。
我正在为一个不和谐机器人的命令工作:
有人类型/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)'
分配给我之前定义的exp
var。
机器人没有输出。
有没有一种方法可以将字符串拆分为/calc
以及我可以自动分配给变量的其他内容?
谢谢!
虽然this answer可以工作,但这可能会以恶意的方式使用:代码将运行字符串中的所有内容,因此如果有人写出正确的内容,他们可以将代码插入到机器人中,使其容易受到攻击。例如,他们可以使用/calc client.destroy()
将其关闭,或者使用/calc client.token
读取其令牌:最好不要让eval
命令公开访问。
您可以像在其他答案中所述解析表达式,然后使用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。
解析输入的最简单方法是使用String.split
。那是...
const words = message.content.split(' ');
const command = words[0];
const variables = words.splice(1).join(' ');
这里命令将变为'/ calc',变量将变为'4 + 5'
这是有效的,因为在你需要你的discord bot处理的任何输入中,第一个单词将始终是命令。
let message = '/calc 4+5'
let equation = message.replace(//calc/, '').trim();
let answer = eval(equation)
console.log(equation+' =', answer )
我不知道你是如何获得message.content
和exp
的。但是,根据我的理解,你可以做如下的事情:
let cmdString = "/calc4+5";
let mathExpression = cmdString.split("/calc")[1];
let result = eval(mathExpression);
result
是你的结果值的表达式。
谢谢...
以上是关于如何取出包含数学表达式并给出结果的字符串的某些部分的主要内容,如果未能解决你的问题,请参考以下文章
当正则表达式的某些部分要保存在后续的分割字符串中时,如何使用正则表达式在R中拆分字符串?
华为OD机试 - 最长合法表达式(Python)| 真题+思路+代码
如果子字符串包含在引用字符串中,如何使用布尔表达式进行匹配?