2009-06-02 11 views
0

Bon, voici ma fonction de test en cours '?:problème simple regex: Remplacer les mots avec de

function make_void(str) 
{ 
    var str_arr = str.split(/[\W]+/); 
    var voidstr; 
    var newstr = ""; 

    for (var i = 0; i < str_arr.length; i++) 
    { 
     voidstr = str_arr[i]; 
     // if (Math.random() <= 0.9) 
     // { 
      voidstr = voidstr.replace(/\w/gi, "?"); 
     // } 

     newstr += voidstr + " "; 
    } 

    document.writeln(newstr); 
} 

Le problème? Les ponctuations sont perdues.

Quelle est une bonne façon de réviser cela de telle sorte qu'elles ne le sont pas?

Répondre

3

Diviser sur des espaces (\s) pas sur un non-mot (\W) et vous conserverez la ponctuation.

function make_void(str) 
{ 
     var str_arr = str.split(/\s+/); // !!!THIS LINE CHANGED!!! 
     var voidstr; 
     var newstr = ""; 

     for (var i = 0; i < str_arr.length; i++) 
     { 
       voidstr = str_arr[i]; 
       // if (Math.random() <= 0.9) 
       // { 
         voidstr = voidstr.replace(/\w/gi, "?"); 
       // } 

       newstr += voidstr + " "; 
     } 

     document.writeln(newstr); 
} 


mise à jour: Exemple d'extrait en utilisant la méthode Array.join():

for (var i = 0; i < str_arr.length; i++) 
{ 
    // if (Math.random() <= 0.9) 
    // { 
     str_arr[i] = str_arr[i].replace(/\w/gi, "?"); 
    // } 
} 

var newstr = str_arr.join(' '); 
+0

bon point, sans jeu de mots :) –

+0

Oh! Duh! Je savais qu'il y avait une réponse facile à cela. : P –

+0

Oh, et une autre pensée - envisager d'utiliser Array.join ('') au lieu de la concaténation de chaîne manuelle - Je pense que ce serait plus rapide, et je dirais certainement que c'est plus lisible ... –

1

Un exemple de texte de ce que vous essayez de faire correspondre pourrait vous aider. (? Qu'est-ce que vous voulez vraiment garder)

Pour l'instant, l'expression rationnelle suivante pourrait aider:

[\w\d,.?:;"'-()] 

Cela correspond à des mots, des chiffres, et un certain nombre de caractères de ponctuation (bien que pas tous).