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

标签 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 函数操作之后我总是得到错误的答案。请问有人知道我该如何解决这个问题吗?

最佳答案

您可以使用递归函数,该函数在没有其他标记匹配时停止。例如:

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>

关于javascript - 如何在字符串中递归替换字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36641900/

相关文章:

javascript - Apache Tomcat 和 Spring MVC 在 View 上使用 javascript 库

javascript - 不允许双下划线的正则表达式,除非它在单词的末尾后跟 'x' 符号

java - 如何在java中格式化字符串 "012df3g4h5j6 78"=> "01 23 45 67 8"

javascript - 当我输入回车键时,它不起作用..msg 没有附加到任何地方

javascript - vue.js:从观察者更新数据

javascript - ipcRenderer.send和sendSync无法从预加载到主要状态

javascript - 如何使用javascript从数组中打印元素

regex - 使用 RegEX 跳过前 3 个前导字符

javascript - JavaScript Regex捕获十进制的重复部分

java - 按 ","拆分时从字符串中删除空格