2016-04-15 4 views
0

У меня есть математическое выражение, которое выполняет экспоненты (например, 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); 

В любое время я вхожу в выводе СИЛ дает 4^2 вместо 16, и поэтому я всегда получаю неправильный ответ после выполнения функции Eval действий. Пожалуйста, кто-нибудь знает, как я могу решить эту проблему.

+0

Что такое значение 'c'? –

+0

Ваше регулярное выражение довольно простое: оно не выполняется в ряде случаев: не целое число (2.3^2), числа с exp (2e-3^0.5), отрицательные числа (2^-2, 4 + -5^2) –

ответ

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>

+0

@Tushar у вас есть идея, как я могу написать регулярное выражение, чтобы замена работала для отрицательных, положительных и десятичных чисел? Спасибо – user3775998

+0

@ user3775998 Попробуйте ['[+ -]? \ D + (?: \. \ D +)?'] (Https://regex101.com/r/cH8pF8/1) – Tushar

Смежные вопросы