2010-05-10 3 views
3

Comment puis-je appliquer plusieurs expressions rationnelles à une seule chaîne?Multiple Regex on String

Par exemple, un utilisateur entre les éléments suivants dans une zone de texte:

red bird 
blue cat 
black dog 

et je veux remplacer chaque retour chariot par une virgule et chaque espace avec un trait de soulignement de sorte que la chaîne finale se lit comme red_bird, blue_cat ,chien noir.

J'ai essayé des variations dans la syntaxe le long des lignes de ce qui suit à ce jour:

function formatTextArea() { 
    var textString = document.getElementById('userinput').value; 

    var formatText = textString.replace(
     new RegExp("\\n", "g"),",", 
     new RegExp("\\s", "g"),"_"); 

    alert(formatText); 
} 

Répondre

3

Vous pouvez enchaîner les remplacements. Chaque application de la méthode replace rétablit une chaîne, donc sur cette chaîne, vous pouvez appliquer à nouveau le remplacement. Comme:

function formatTextArea() { 
    var textString = document.getElementById('userinput').value; 

    var formatText = 
     textString.replace(/\n/g,",") 
        .replace(/\s/g,"_"); 

    alert(formatText); 
} 

En passant, tous ces nouveaux objets Expression régulière ne sont pas nécessaires. Utilisez les littéraux Expression régulière (comme /\n/g ci-dessus).

+0

merci pour l'explication. – Choy

1

objet Regexp ont leur propre notation littérale, en utilisant des barres obliques, ce qui signifie que les barres obliques inverses ne doivent pas être échappé. Par exemple, /\n/g est équivalent à new RegExp('\\n','g').

function formatTextArea() 
{ 
    var textString = document.getElementById('userinput').value; 

    textString = textString.replace(/\n/g,",").replace(/\s/g,"_"); 

    alert(textString); 
} 
3
formatText = textString.replace(/\n/g,',').replace(/\s/g,'_'); 
-3

Inclure http://phpjs.org/functions/str_replace:527 puis

input = str_replace("\\n", ',', input); 
input = str_replace(' ', '_', input); 
+0

Javascript, PHP pas – Eric

+0

je l'ai changé;) – powtac

+3

Pourquoi devriez-vous utilisez ceci*? JavaScript a une fonction native ['replace'] (https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/String/Replace). –

0
var textString = "red blue\nhack bye\ntest rt\n"; 
var formatText = textString.replace(new RegExp("\\n", "g"),",").replace(new RegExp("\\s", "g"),"_"); 
alert(formatText); 
2

Comme d'autres l'ont mentionné, enchaîner est assez bon pour quelque chose d'aussi simple que ce que vous demandez. Cependant, si vous voulez que ce soit plus dynamique, vous pouvez utiliser une fonction de succédané comme second argument:

function formatTextArea() { 
    var textString = document.getElementById('userinput').value; 

    var formatText = textString.replace(/\n|\s/g, function ($0) { 
     if ($0 === "\n") 
      return ","; 
     else if ($0 === " ") 
      return "_"; 
    } 
    alert(formatText); 
} 

utilisant une fonction de succédané vous permettra d'être dynamique sans avoir à la chaîne des appels ensemble à replace(). Il peut également être légèrement plus rapide (l'analyseur regex n'est invoqué qu'une seule fois). Sachez que \s correspondra plus que le caractère d'espace, bien :-) Pour les besoins de votre question, ce serait assez bon:

var formatText = textString.replace(/\n|\s/g, function ($0) { 
    return $0 == "\n" ? "," : "_"; 
}