Показать сообщение отдельно
  #1 (permalink)  
Старый 26.10.2014, 19:50
Новичок на форуме
Отправить личное сообщение для Scampada Посмотреть профиль Найти все сообщения от Scampada
 
Регистрация: 26.10.2014
Сообщений: 7

str.replace, не понимаю механизм глобальной замены
Привет, народ. Есть функция, которая парсит строку на предмет функций и заменяет их соответствующими значениями.

http://jsfiddle.net/johnthecreeper/ERSA2/116/

Здесь полный код. Вот сама функция:

function specFuncs(expression){
        var funcList = /(sin\(\d+\.?\d*\))|(cos\(\d+\.?\d*\))|(\d+\.?\d*\^\d+\.?\d*)|(\d+\.?\d*\!)/gi;
        expression = expression.replace(funcList, function(match,p1,p2,p3,p4,offset,string){
            switch(match) {
                case p1:
                    return Math.sin(parseFloat(match.replace(/[^\d+?\.\d*?]/gi,""))*(Math.PI/180)).toFixed(10).toString();
                case p2:
                    return Math.cos(parseFloat(match.replace(/[^\d+?\.\d*?]/gi,""))*(Math.PI/180)).toFixed(10).toString();
                case p3:
                    return Math.pow(match.split("^")[0],match.split("^")[1]).toFixed(10).toString();
                case p4:
                    var temp = 1;
                    match = parseInt(match);
                    while(match) temp *= match--; return temp.toFixed(10).toString();
            }
        });
        return expression;
    }


На данный момент все работает, но я пытаюсь обработать такую строку: 2^2^2, после чего получаю результат 4. Добавляю в функцию алерты для выяснения сколько раз и для чего вызывается замена, и получается, что в первый раз функция замены ловит 2^2, а затем отдает на выход функции недорешенную строку 4.00000000^2. Сама по себе такая строка тоже парсится и решается, отдельно. При этом строка, например, вида 2^2 + 2! -3^1 парсится правильно, то есть сначала ловится 2^2, затем все остальное по очереди. И обе части с возведением в степень ловятся, а вот в первом случае, по идее, чем оно отличается? Сначала ловится одно возведение в степень, затем должно парсить строку с промежуточным результатом, найти там еще одну возможность замены и сматчить. Но не делает этого. Почему?
Ответить с цитированием