Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.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中,如果还有其他文本,如何计算表达式_Javascript - Fatal编程技术网

在Javascript中,如果还有其他文本,如何计算表达式

在Javascript中,如果还有其他文本,如何计算表达式,javascript,Javascript,我有以下javascript字符串 var q = "M (95+(4*5)) L (95-(4*5))" 我需要它看起来像 "M 115 L 75" 请注意,VarQ可能是一个很长的模式,包含多个M和L。有人知道如何实现这一点吗。任何帮助都将不胜感激。这里有一个明智而可靠的方法,无需求助于eval: var q=“M(95+(4*5))L(95.3-(4*5))” 设res=(函数修复(输入){ 让输出=输入。替换(/\(\s*(?[\d.]+)\s*([*+-])\s*(?[\d.]+

我有以下javascript字符串

var q = "M (95+(4*5)) L (95-(4*5))"
我需要它看起来像

"M 115 L 75"

请注意,VarQ可能是一个很长的模式,包含多个M和L。有人知道如何实现这一点吗。任何帮助都将不胜感激。

这里有一个明智而可靠的方法,无需求助于
eval

var q=“M(95+(4*5))L(95.3-(4*5))”
设res=(函数修复(输入){
让输出=输入。替换(/\(\s*(?[\d.]+)\s*([*+-])\s*(?[\d.]+)\s*\)/g,函数(\,a,op,b){
开关(op){
大小写“+”:返回+a++b;
案例'-':返回a-b;
案例“*”:返回a*b;
默认值:返回“\u1”;
}
});
返回输入==输出?输入:修复(输出);
})(q) );

console.log(“res=”,res)编辑:面向未来读者:我的解决方案被认为使用
eval()
存在安全风险的用户否决。他们正确地认为,评估不受信任的代码是一种风险。但是由于OP没有说源代码不可信,所以在OP澄清字符串源确实不可信之前,我的解决方案仍然有效

在我看来,解决方案是双向的:

首先,使用正则表达式将字符串分组为一个字母(如“M”),其余的直到下一个字母

您还可以使用一种更简单的方法,在字母处拆分字符串(如“M”和“L”)

无论您选择哪种方式,都会得到一个对象数组,每个条目都有一个字母和一些数学字符串

您可以简单地
eval()
math sting()并获得结果


在我看来这并不难,但这是进入字符串拆分和“eval”的好方法:)

您需要修复括号

let str=“M(95+(4*5))L(95-(4*5))”;
让res=str.split(“”).map(e=>{
试一试{
返回评估(e);
}捕捉(错误){
返回e;
}
}).加入(“”);

console.log(res)
您可以使用
M
L
作为标记,并且只使用
eval
之间的部分

var q=“M(95+(4*5))L(95-(4*5))”;
q=q.replace(/([ML])(.*?(=[ML]|$)/g,([u,a,b)=>a+''+eval(b)+'';

控制台日志(q)如果初始字符串总是以这种方式格式化,那么当元素不是保留字符时,我将进行拆分然后求值

var q = 'M (95+(4*5)) L (95-(4*5))'

let processed = ''
let arr = q.split(' ')

arr.forEach(a => {
  if (a !== 'M' && a !== 'L') {
    a = eval(a)
  }
  processed = processed.concat(a, ' ')
})
# Now proccessed is 'M 115 L 75 ' you can trim and remove extra space
processed = processed.trim()
如果您将在客户端使用它,我不建议您使用它,因为正如其他人所说的,这可以通过F12进行更改


但是,如果您只在服务器端使用此功能,并控制输入,那么这就不是问题。

concat数学?没有办法做到这一点。您必须以某种方式解析出要计算的代码。您可以使用模板文本,而不是
var q=“M((95+(4*5))L((95-(4*5))”
您可以使用
var q=`M${(95+(4*5))}L${(95-(4*5))}`
@hajile78假设OP在得到字符串之前可以操作/构造字符串,但他从来没有提到过。所以我想我们不能只是假设。你需要使用regexp或使用字符串拆分,就像我在回答中写的:)请注意,根据实际问题,可能会首选各种解决方案。似乎需要更高的精度。一种更干净、更简单的方法是使用“eval”,因为“eval”完全适用于这些场景:)我不同意@spyro,这真的很好,因为它不会评估任意代码。@spyro让我们忘记所有与评估任意代码相关的风险。写下eval版本,你会发现它不是很清晰(如果你处理各种情况),而且速度要慢得多。@DenysSéguret@MarkMeyer OP没有说字符串来自不可信的来源。您应该评估不受信任的代码。但由于这不是问题所在,因此
eval
函数完全符合需要。OP也没有说数学函数仅限于提供的示例,因此,如果您正在编写一些手动计算代码,则必须实现所有可能的数学边缘情况。@spyro这就是为什么我说“让我们忘记与计算任意代码相关的所有风险”:我同意OP可能没有这种担心(我们希望代码以后不会与输入的字符串一起使用)。对于任何想使用eval的人:在启动之前,请至少检查一下您没有任何其他[*+-\d()]的字符!您忘记了加入
。只是一个注释(这可能很重要,取决于OP的目标):这个字符串看起来有点像是为SVG路径构建的,在这种情况下,可能需要更长的字符串和每个字母几个数字。@DenysSéguret也是我的想法,因为模式看起来很相似。但是,由于这个简短的示例没有关于它来自何处的提示,我们不得不假设它可能不是SVG。另外,请注意,使用
对不受信任的代码进行评估是一种安全风险。但由于OP没有对其进行任何说明,此答案在OP的进一步信息发布之前仍然有效。此外,我在您回答之前6分钟回答了同样的问题;)也许那些对有效答案投反对票的人可以对其进行评论,为什么会投反对票。Stackoverflow是一个我们应该交流信息和知识的地方,关于“评估”——我已经编辑了我的答案。如果您不直接假设字符串中的代码不受信任,那么使用“eval”完全可以。如果没有,请恩皮格提供进一步的信息,说明为什么我的答案在你看来是无效的/好的。这不是一个有效的答案。Eval是可以更改的-尤其是客户端Eval。@treyBake“可以更改”是什么意思?为什么要这样假设?OP没有说他想在哪里执行这段代码。如果您要抱怨函数被覆盖的可能性,那么您必须假设每个函数都被覆盖,并且您也不能使用reged,因为它可能被覆盖。如果你暗示的是不同的东西,请特别说明。如果有其他原因不使用eval,我和其他人会通知