2010-06-03 1 views
2

Предположим, что мне это нравится: "\\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
+0

насчет '\ r'? – SLaks

+0

Да, я не включил его в пример. Я изменю принятый ответ, чтобы перевести '\ r' и некоторые другие специальные символы. – 2010-06-03 14:28:41

+0

Вы хотите нормализовать все символы новой строки? (Другими словами, вы хотите преобразовать '\ r',' \ n' и '\ r \ n' в одно представление?) – SLaks

ответ

2

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

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

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

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

(испытано)

+0

Он работает! Я подожду 2 часа, пока не приму ответ, чтобы убедиться, что получаю очень оптимизированное решение. – 2010-06-03 14:37:11

+0

Обратите внимание, что вы можете добавить дополнительные коды эвакуации. Кроме того, это _completely_ не сможет обработать '\ x64'. Если вы захотите, я изменю его, чтобы обработать их. – SLaks

+0

Я знаю, я его изменяю :) – 2010-06-03 14:48:06

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); 
+0

Вы можете просто написать 'return charMappings [ch ] || ch; 'Кроме того, что такое' \ & '? – SLaks

+0

Это и я не знаю, но я нашел его в таблице, на которую я смотрел .__. – 2010-06-03 15:20:42

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