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.

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


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.


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.


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","")

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"

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.