代码之家  ›  专栏  ›  技术社区  ›  Aparna

在javascript中,如果还有其他文本,如何计算表达式[关闭]

  •  3
  • Aparna  · 技术社区  · 6 年前

    我有下面的javascript字符串

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

    我需要它看起来像

    "M 115 L 75"
    

    请注意,VaR Q可能是一个非常长的模式,具有多个M和L。有人知道如何实现这一点吗?任何帮助都将不胜感激。

    5 回复  |  直到 6 年前
        1
  •  5
  •   Denys Séguret    6 年前

    这是一种理智可靠的方法,不用诉诸于 eval :

    var q = "M (95+(4*5)) L (95.3-(4*5))"
    
    let res = (function fix(input){
      let output = input.replace(/\(\s*(-?[\d.]+)\s*([*+-])\s*(-?[\d.]+)\s*\)/g, function(_, a, op, b){
         switch(op){
         case '+': return +a + +b;
         case '-': return a - b;
         case '*': return a * b;
         default: return "_";
         }
       });
       return input==output ? input : fix(output);
    })(q);
    
    console.log("res=", res);

    这个想法只是简单地取代所有 ( number operator number ) 直到没有什么可以替代的。

    注意,这也适用于更复杂的表达式(我假设您正在构建SVG路径),并且不会在第一个添加的空间中断。

        2
  •  2
  •   Nina Scholz    6 年前

    你可以采取 M L 作为标记,只取 eval .

    var q = "M (95+(4*5)) L (95-(4*5))";
    
    q = q.replace(/([ML])(.*?)(?=[ML]|$)/g, (_, a, b) => a + ' ' + eval(b) +' ');
    
    console.log(q);
        3
  •  -2
  •   Vadim Hulevich    6 年前

    你需要固定括号

      let str = "M (95+(4*5)) L (95-(4*5))";
      
      let res = str.split(" ").map(e=>{
        try{
          return eval(e);
        }catch(err){
          return e;
        }
      }).join(" ");
      
      console.log(res)
        4
  •  -2
  •   Caio Godoy    6 年前

    如果初始字符串总是以这种方式格式化,那么当元素不是保留字符时,我将拆分它,然后进行eval。

    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更改。

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

        5
  •  -5
  •   mhombach    6 年前

    编辑:对于未来的读者:我的解决方案被认为使用 eval() 是一种安全风险。他们正确地认为评估不可信的代码是一种风险。但是,由于op没有说任何不可信的源,所以在op澄清字符串源确实不可信之前,我的解决方案仍然有效。

    我认为,解决方案是双向的:

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

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

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

    你可以简单 表达式() 数学难题( https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/eval )然后得到结果。

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