如何将带有转义字符的字符串转换为“普通”字符串

时间:2010-06-03 14:24:00

标签: javascript parsing

让我说我喜欢这个:"\\n",我需要将它转换为字符串,就像解释器会这样做:\n

这样的简单替换不起作用:

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

我需要这种行为:

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

2 个答案:

答案 0 :(得分:2)

最简单,最邪恶的解决方案是写return eval(s) 不要那样做。

相反,您需要使用匹配评估程序进行一次replace调用,如下所示:

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

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

(测试)

答案 1 :(得分:1)

感谢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);