2009-12-13 5 views
18

string.sub ressemble à remplacer seulement la première instance. Y at-il une option pour cela ou une autre méthode qui peut remplacer tous les modèles? Pouvez-vous le faire dans une regex comme Perl?Comment puis-je remplacer chaque occurrence d'un motif dans ruby?

(Je pense que quelque chose comme r/bla/bla /)

... et +1 à quelqu'un qui peut me dire pourquoi diable ne string.sub vient remplacer le premier match?

+1

Pour la même raison que Perl a besoin d'un modificateur 'g' pour rendre les substitutions globales. Remplacer tout est souvent ce que vous voulez, mais pas toujours. – Telemachus

Répondre

48

String.gsub devrait faire l'affaire.

Citation des documents:

gsub(pattern, replacement) → new_str

retourne une copie de str avec les toutes les occurrences du motif substitués pour le second argument. Le motif est généralement Regexp; si elle est donnée en tant que chaîne, tous les métacaractères d'expression régulière qu'elle contient seront interprétés littéralement, par ex. \\d correspond à un suivi de d, au lieu d'un chiffre.

+4

w00t. Merci. On pourrait penser que sub ferait cela par défaut et ensuite avoir un paramètre int pour remplacer les N premières occurrences! – DJTripleThreat

+4

DJ: non tu ne le ferais pas. Si vous voulez remplacer le premier match, vous avez le choix entre ** SUB ** stitute, sinon ** G ** lobal ** SUB ** stitute est votre choix. –

+0

Pour plus de détails, voici la [page de manuel] (http://www.ruby-doc.org/core-2.1.1/String.html#method-i-gsub). –

5

Je pourrais expliquer pourquoi sub remplace juste le premier match d'un modèle, mais je pense que la documentation qu'il fait tellement mieux (de ri String#sub sur la ligne de commande):

str.sub(pattern, replacement)   => new_str 
str.sub(pattern) {|match| block }  => new_str 

Returns a copy of _str_ with the _first_ occurrence of _pattern_ 
replaced with either _replacement_ or the value of the block. 
+4

wow, j'utilise du rubis et des rails depuis des années. Aujourd'hui, c'était la première fois que je tapais ri quelque chose # méthode à cause de votre poste. Je n'avais aucune idée de cette fonctionnalité était là! Vous venez de googler les termes et trouver les docs de cette façon. –

Questions connexes