2010-10-24 6 views
2

Nous aimerions faire un remplacement dans notre chaîne comme ceci: - Chaque fois qu'un \ n (nouvelle ligne) ou \ t (tabulation) ou \ r (retour chariot) apparaît , il devrait être remplacé par la chaîne "\ n" ou "\ t" ou "\ r".Aide avec les expressions régulières (méthode JS de remplacement)

Par exemple, cette chaîne:
"? Bonjour, comment êtes-vous

merci fin."

Doit être remplacé par:
"Bonjour, comment allez-vous? Merci!"

Pourriez-vous nous aider? Nous essayons avec ce code dans Jscript (méthode replace()), mais il ne fonctionne pas:

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

MERCI!

Répondre

1

Je ne suis pas sûr d'un moyen facile de combiner ce que vous faites, la longue main fonctionnera bien:

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

Ou bien, vous pouvez le faire en une seule passe en utilisant une fonction, comme ceci:

myString.replace(/([\n|\t])/g, function(a, m) { return m=="\n"?"\\n":"\\t"; }); 
1

\\$1 serait une barre oblique inverse suivie de la nouvelle ligne ou un onglet. (Soit dit en passant, [\n|\t] fait aussi pas ce que vous pensez qu'un groupe de caractères n'a pas besoin du |..)

Si vous vouliez la carte échappe à cordes, vous pouvez le faire avec un constructeur RegExp explicite:

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

même si cela ne vaut peut-être pas le coup pour seulement deux évasions. Mais qu'en est-il des autres personnages de contrôle? Et qu'en est-il du backslash lui-même?

Si vous essayez de créer un littéral de chaîne JavaScript à partir d'une chaîne, un meilleur endroit pour commencer pourrait être JSON.stringify.

+1

création de la nouvelle RegExp est plus lent que d'avoir le reg exp déjà défini. Pas énorme, mais peut être perceptible s'il y a une grande liste de choses à remplacer et le nombre total de millisecondes. – epascarello

0

J'utiliser un objet qui associe les caractères aux séquences d'échappement comme une carte comme suit:

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]; }); 
0

3 solutions:

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"); 
Questions connexes