Как преобразовать строку с экранированными символами в «нормальную» строку - PullRequest
2 голосов
/ 03 июня 2010

Скажем, у меня вот так: "\\n", мне нужно преобразовать его в строку, как если бы это делал интерпретатор: \n.

Простая замена, подобная этой, не сработает:

function aaa(s){
    return s.replace(/\\n/gm,'\n').replace(/\\\\/gm,'\\');
}

Мне нужно это поведение:

  • "Line 1\nLine 2" => Line 1<Line break>Line 2
  • "Line 1\\nLine 1" => Line 1\nLine1

Ответы [ 2 ]

2 голосов
/ 03 июня 2010

Самое простое и самое злое решение - написать return eval(s).
Не делай этого.

Вместо этого вам нужно сделать один replace вызов с оценщиком совпадений, например:

var escapeCodes = { 
    '\\': '\\',
    'r':  '\r',
    'n':  '\n',
    't':  '\t'
};

return s.replace(/\\(.)/g, function(str, char) {
    return escapeCodes[char];
});

(испытано)

1 голос
/ 03 июня 2010

Спасибо SLaks за ответ.

Вот окончательный код:

(function(self,undefined){
    var charMappings = { 
        '\\':   '\\',
        'r':    '\r',
        'n':    '\n',
        't':    '\t',
        'b':    '\b',
        '&':    '\&'
    };
    var rg=(/\\(.|(?:[0-7]{3})|(?:x[0-9a-fA-F]{2})|(?:u[0-9a-fA-F]{4}))/gm);
    self.mapString=function(s){
        return s.replace(rg, function(str, ch) {
            switch(ch.length){
                case 1:
                    return charMappings.hasOwnProperty(ch)?charMappings[ch]:ch;
                case 2:
                case 4:
                    return String.fromCharCode(parseInt(ch,16));
                case 3:
                    return String.fromCharCode(parseInt(ch,8));
            }
        });
    }
})(window);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...