Javascript 在所有单词Regex/Typescript前面添加字符
我目前正在尝试向我的discord机器人添加简单的数学解决功能,这是通过首先消毒用户输入(以解决安全问题),然后通过Javascript 在所有单词Regex/Typescript前面添加字符,javascript,regex,Javascript,Regex,我目前正在尝试向我的discord机器人添加简单的数学解决功能,这是通过首先消毒用户输入(以解决安全问题),然后通过新函数运行它来完成的。问题是,我希望Math对象中当前的所有函数对于用户来说都是独立的,我的意思是: 要获得数字的平方根,我可以在JS内部使用Math.sqrt(25)。我不希望用户必须处理数学。,因此理想情况下,他们只需使用sqrt(25)。整个消息可能看起来像:!求解sqrt(25),它将返回5 因为消息内容已经是一个字符串,并且已经消毒,所以该字符串中只有数字、运算(+、-、
新函数运行它来完成的。问题是,我希望Math
对象中当前的所有函数对于用户来说都是独立的,我的意思是:
要获得数字的平方根,我可以在JS内部使用Math.sqrt(25)
。我不希望用户必须处理数学。
,因此理想情况下,他们只需使用sqrt(25)
。整个消息可能看起来像:!求解sqrt(25)
,它将返回5
因为消息内容已经是一个字符串,并且已经消毒,所以该字符串中只有数字、运算(+、-、*、/、^或**)或数学函数(cos、sin、sqrt等)。因为这些数学函数是这里唯一的“单词”,所以解决这个问题的一个非常简单的方法就是把这个字符串中的所有“单词”,在每个单词前面加上Math.
,然后求解这个方程
以下是psudo代码和示例:
Psudocode: | Example:
1. Get user input | input = '! solve 5 + cos(10) / sqrt(50)*random()'
2. Trim input to only the equation | input = '5 + cos(10) / sqrt(50)*random()'
3. Add Math. to beginning of words | input = '5 + Math.cos(10) / Math.sqrt(50)*Math.random()'
4. Compile into result variable | result = new Function(`return ${input}`);
5. If step 4 failed, tell user | send(`bla is not a math function`); //<-- if input was bla(50)
6. Send user result | send(result);
Psudocode:|示例:
1.获取用户输入|输入='!求解5+cos(10)/sqrt(50)*random()
2.仅将输入微调到方程|输入='5+cos(10)/sqrt(50)*random()
3.加上数学。到单词的开头| input='5+Math.cos(10)/Math.sqrt(50)*Math.random()
4.编译成结果变量| result=new函数(`return${input}`);
5.如果步骤4失败,告诉用户| send(`bla不是一个数学函数`)// 清理字符串后,如果从Math
提取要允许的方法或属性,则无需替换任何内容:
const输入='5+cos(10)/sqrt(50)*random();
常数{sqrt,pow,random,cos,sin,PI}=数学;
控制台日志(eval(输入))代码>关于@blex的答案很好。下面是另一个对alpha字符进行全局搜索和替换的解决方案:
函数evalExpr(str){
试一试{
str=str.replace(/\b([a-z]+*\()/g,'Math.$1');
返回评估(str);
}捕获(e){
返回'Error evaluation'+str+'';
}
}
常量输入='四舍五入((5+cos(10)/sqrt(50))*10)/10';
console.log(输入+'='+evalExpr(输入));