Comment puis-je supprimer la chaîne «\ n» d'une chaîne Ruby?

115

J'ai cette chaîne:

"some text\nandsomemore"

Je dois en supprimer le "\ n". J'ai essayé

"some text\nandsomemore".gsub('\n','')

mais ça ne marche pas. Comment fait-on ça? Merci d'avoir lu.

ben
la source

Réponses:

172

Vous devez utiliser "\n"not '\n'dans votre gsub. Les différents guillemets se comportent différemment.

Les guillemets doubles "permettent l'expansion des caractères et l'interpolation d'expression. ils vous permettent d'utiliser des caractères de contrôle échappés comme \npour représenter leur vraie valeur, dans ce cas, une nouvelle ligne , et permettent l'utilisation de#{expression} afin que vous puissiez tisser des variables et, bien, à peu près n'importe quelle expression ruby ​​que vous aimez dans le texte.

Alors que d'un autre côté, les guillemets simples 'traitent la chaîne littéralement, il n'y a donc pas d'expansion, de remplacement, d'interpolation ou quoi que ce soit d'autre.

Dans ce cas particulier, il est préférable d'utiliser la méthode .deleteou .trString pour supprimer les nouvelles lignes .

Voir ici pour plus d'informations

ocodo
la source
17
la syntaxe appropriée serait vraiment .gsub (/ \ n /, "")
boulder_ruby
2
@David a raison. Cependant, j'ai estimé qu'il était important de montrer que les citations font une différence, car cela profiterait à Ben à ce stade. Remarquez, David, c'est probablement plus une question de style que de "correct". Personnellement, je pense que trc'est un meilleur choix pour cette tâche, mais comme je l'ai dit, j'ai pensé qu'il était préférable de souligner la différence entre guillemets simples et doubles lorsque j'ai répondu.
ocodo
60

Lorsque vous souhaitez supprimer une chaîne, plutôt que de la remplacer, vous pouvez utiliser String#delete(ou son équivalent mutateur String#delete!), par exemple:

x = "foo\nfoo"
x.delete!("\n")

x équivaut désormais à "foofoo"

Dans ce cas précis, il String#deleteest plus lisible que gsubpuisque vous ne remplacez pas réellement la chaîne par quoi que ce soit.

Chef Paul
la source
3
Dans Ruby 1.9.3 au moins, deleten'est pas destructif comme indiqué ici. Il renvoie une nouvelle chaîne.
Brent Dillingham
Bien repéré. J'ai mis à jour cet extrait de code pour utiliser la version du mutateur String # delete! plutôt que String # delete
Paul Leader
56

Si vous voulez ou que cela ne vous dérange pas de supprimer tous les espaces de début et de fin de votre chaîne, vous pouvez utiliser la stripméthode.

"    hello    ".strip   #=> "hello"   
"\tgoodbye\r\n".strip   #=> "goodbye"

comme mentionné ici .

modifier Le titre original de cette question était différent. Ma réponse concerne la question initiale.

ThomasW
la source
2
Cela ne répond pas à la question. stripsupprime uniquement les espaces de début
thelostspore
1
@mvdanj Oui, étant donné les détails de cette question particulière, il n'y répond pas, mais il répond à la question uniquement en fonction du titre. Je soupçonne que c'est pourquoi les gens l'ont trouvé utile.
ThomasW
Le titre a été changé depuis le moment où j'ai initialement répondu.
ThomasW
29

Vous n'avez pas besoin d'une expression régulière pour cela. Utilisez tr:

"some text\nandsomemore".tr("\n","")
Mark Thomas
la source
quelle est la difference entre tr an replace?
Arnold Roa
replacechange simplement la chaîne en une nouvelle, comme l'affectation de variable; alors que trest une recherche et un remplacement global caractère par caractère.
Mark Thomas
21

utilisation chompou stripfonctions de Ruby:

"abcd\n".chomp => "abcd"
"abcd\n".strip => "abcd"
Mateo Vidal
la source
2
Cela ne répond pas à la question. stripsupprime uniquement les espaces de début
thelostspore
2
chomp est le meilleur moyen ... je ne peux pas croire que cela a donc moins de votes positifs
user1735921
dans la méthode chomp, \ n et \ r sont supprimés de la fin de str s'ils existent, pas au milieu. Donc, cela ne résout pas la question OP
silva96