Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在所有单词Regex/Typescript前面添加字符_Javascript_Regex - Fatal编程技术网

Javascript 在所有单词Regex/Typescript前面添加字符

Javascript 在所有单词Regex/Typescript前面添加字符,javascript,regex,Javascript,Regex,我目前正在尝试向我的discord机器人添加简单的数学解决功能,这是通过首先消毒用户输入(以解决安全问题),然后通过新函数运行它来完成的。问题是,我希望Math对象中当前的所有函数对于用户来说都是独立的,我的意思是: 要获得数字的平方根,我可以在JS内部使用Math.sqrt(25)。我不希望用户必须处理数学。,因此理想情况下,他们只需使用sqrt(25)。整个消息可能看起来像:!求解sqrt(25),它将返回5 因为消息内容已经是一个字符串,并且已经消毒,所以该字符串中只有数字、运算(+、-、

我目前正在尝试向我的discord机器人添加简单的数学解决功能,这是通过首先消毒用户输入(以解决安全问题),然后通过
新函数运行它来完成的。问题是,我希望
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(输入));