Помогите с регулярными выражениями (метод замены JS) - PullRequest
2 голосов
/ 24 октября 2010

Мы хотели бы сделать замену в нашей строке следующим образом: - Каждый раз, когда появляется \ n (новая строка) или \ t (табуляция) или \ r (возврат каретки), его следует заменить строкой "\ n" или "\ t" или "\ r".

Например, эта строка:
"Привет, как
ты?
Прекрасно, спасибо. "

Следует заменить на:
«Привет, как \ n \ tare you? \ NХорошо, спасибо.»

Не могли бы вы помочь нам? Мы пытаемся использовать этот код в Jscript (метод replace ()), но он не работает:

myString.replace(/([\n|\t])/g, "\\$1");

СПАСИБО!

Ответы [ 4 ]

1 голос
/ 24 октября 2010

\\$1 будет обратной косой чертой с последующим переводом строки или табуляции. (Между прочим, [\n|\t] также не делает то, что вы думаете. Группе персонажей не требуется |.)

Если вы хотите отобразить экранирование строк, вы можете сделать это с помощью явного конструктора RegExp:

var escapes= ['n', 't'];
for (var i= escapes.length; i-->0;)
    s= s.replace(new RegExp('\\'+escapes[i], 'g'), '\\'+escapes[i]);

хотя это может не стоить всего лишь двух побегов. Но как насчет других управляющих символов? А как насчет самой обратной косой черты?

Если вы пытаетесь сделать строку JavaScript литеральной из строки, лучше начать с JSON.stringify.

1 голос
/ 24 октября 2010

Я не уверен, что можно легко комбинировать то, что вы делаете, хотя длинная рука будет работать:

myString.replace(/\n/g, "\\n").replace(/\t/g, "\\t");

Или вы можете сделать это за один проход, используя функцию, например:

myString.replace(/([\n|\t])/g, function(a, m) { return m=="\n"?"\\n":"\\t"; });
0 голосов
/ 24 октября 2010

3 решения:

var str = "";
for(var i=0;i<5000;i++){
    str += "\t\n";
}

function replaceType( s ){

    switch( s ){
        case "\n":
            return "\\n";
            break;
        case "\t":
            return "\\t";
            break;
        default:
             return s;
    }

}

//slow solution
console.time("replace function");
str.replace(/([\n|\t])/g, replaceType);
console.timeEnd("replace function");

//fast solution
console.time("chained replace");
str.replace(/\t/g, "\\t").replace(/\n/g, "\\n");
console.timeEnd("chained replace");

//slightly slower than chained
var replaceChars = { "\\t": /\t/g, "\\n": /\n/g };
var out = str;
console.time("looped chained replace");
for(re in replaceChars){
    out = out.replace(replaceChars[re], re);
}
console.timeEnd("looped chained replace");
0 голосов
/ 24 октября 2010

Я бы использовал объект, который связывает символы с escape-последовательностями в виде карты следующим образом:

var map = {"\b":"\\b", "\t":"\\t", "\n":"\\n", "\v":"\\v", "\f":"\\f", "\r":"\\r"};
str = str.replace(/[\b\t\n\v\f\r]/g, function(val) { return map[val]; });
...