如何在一个字符串中递归地替换字符

问题描述:

我有一个数学表达式,它通常会传递给JavaScript eval函数的指数(例如2提高到2的幂)。我的字符串表达式的一个例子是2^2^2。现在,JavaScript没有指数运算符,因此在当前示例中,您在操作数之间看到的运算符在JavaScript中是一个按位运算符。如何在一个字符串中递归地替换字符

我试图做的是用从Math.pow(d1,d2)返回的值替换与模式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函数的行为后,错误的答案。请有谁知道我怎么能解决这个问题。

+0

什么是'C'的价值? –

+0

你的正则表达式很简单,它有很多情况会失败:非整数(2.3^2),带exp的数(2e-3^0.5),负数(2^-2,4 + -5^2) –

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

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>

+0

@Tushar你有没有任何想法,我可以如何编写正则表达式,使替换适用于负数,正数和小数?谢谢 – user3775998

+0

@ user3775998尝试['[+ - ]?\ d +(?:\。\ d +)?'](https://regex101.com/r/cH8pF8/1) – Tushar