如何在字符串中递归替换字符

时间:2016-04-15 08:22:28

标签: javascript regex

我有一个数学表达式,它可以执行指数(例如,2提升到2的幂),我通常将其传递给JavaScript eval函数。我的字符串表达式的示例是2 ^ 2 ^ 2。现在,JavaScript没有指数运算符,因此在当前示例中,您在操作数之间看到的运算符是JavaScript中的按位运算符。

我尝试做的是将与模式d1 ^ d2匹配的字符串替换为从Math.pow(d1,d2)返回的值。现在,它在第一次出现时成功完成,但不会在其他事件中成功。以下是我的代码:

var str = '2^2^2';
var regex = /(\d+)\^(\d+)/g;

str = str.replace(c, function(match, $1, $2) {
    console.log(match + '---' + $1 + '---' + $2);
    return Math.pow($1,$2);
});
console.log(str);

eval(str);

任何时候我记录str的输出它给出4 ^ 2而不是16,所以在eval函数动作之后我总是得到错误的答案。请有任何人知道如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

您可以使用在没有其他令牌匹配时停止的递归函数。例如:

var str = '2^2^2';
var regex = /(\d+)\^(\d+)/g;

function recursive(str) {
  var matched = false;
  str = str.replace(regex, function(match, $1, $2) {
    if (match) {
      matched = true;
    }
    return Math.pow($1, $2);
  });
  if (matched) {
    str = recursive(str);
  }
  return str;
}

var result = recursive(str);
console.log(result);
<script src="http://gh-canon.github.io/stack-snippet-console/console.min.js"></script>