如何取出包含数学表达式的字符串的某些部分并给出结果
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.content
和 exp
的。但是,根据我的理解,您可以执行以下操作:
let cmdString = "/calc4+5";
let mathExpression = cmdString.split("/calc")[1];
let result = eval(mathExpression);
result
是表达式的结果值。
谢谢...
虽然 可以工作,但这可能会被恶意使用:代码将 运行 字符串中的所有内容,所以如果有人写了正确的东西,他们就可以将代码插入 bot ,使其容易受到攻击。例如,他们可以使用 /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。
我正在为 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.content
和 exp
的。但是,根据我的理解,您可以执行以下操作:
let cmdString = "/calc4+5";
let mathExpression = cmdString.split("/calc")[1];
let result = eval(mathExpression);
result
是表达式的结果值。
谢谢...
虽然 /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。