86 votes

comment remplacer en toute sécurité tous les espaces blancs par des traits de soulignement par ruby ?

Cela fonctionne pour toutes les chaînes contenant des espaces blancs

 str.downcase.tr!(" ", "_")

mais les chaînes qui n'ont pas d'espaces sont simplement supprimées

Donc "New School" deviendrait "new_school" mais "color" serait "", rien !

158voto

Sampat Points 824

avec espace

 str = "New School"
str.parameterize.underscore

=> "new_school"

sans espace

 str = "school"
str.parameterize.underscore

=> "school"

Éditer :- nous pouvons également passer '_' comme paramètre à paramétrer.

avec espace

 str = "New School"
str.parameterize('_')

=> "new_school"

sans espace

 str = "school"
str.parameterize('_')

=> "school"

EDIT :

Pour les rails 5 et supérieurs, utilisez str.parameterize(separator: '_')

45voto

rwilliams Points 11715

La doc pour tr! dire

Traduit str en place, en utilisant les mêmes règles que String#tr. Renvoie str ou nil si aucune modification n'a été apportée.

Je pense que vous obtiendrez les bons résultats si vous utilisez tr sans l'exclamation.

39voto

Zack Xu Points 1531

Si vous souhaitez obtenir une chaîne dans snake case , la solution proposée ne fonctionne pas tout à fait, car vous pouvez obtenir des traits de soulignement concaténés et des traits de soulignement de début/de fin.

Par exemple

 1.9.3-p0 :010 > str= "  John   Smith Beer "
  => "  John   Smith Beer " 
1.9.3-p0 :011 > str.downcase.tr(" ", "_")
  => "__john___smith_beer_"

Cette solution ci-dessous fonctionnerait mieux:

 1.9.3-p0 :010 > str= "  John   Smith Beer "
  => "  John   Smith Beer " 
1.9.3-p0 :012 > str.squish.downcase.tr(" ","_")
  => "john_smith_beer" 

squish est une méthode String fournie par Rails

17voto

theterminalguy Points 858

Si vous utilisez des rails 5 et plus, vous pouvez obtenir la même chose avec

 str.parameterize(separator: '_')

9voto

br3nt Points 640

Vieille question, mais...

Pour tous les espaces, vous voulez probablement quelque chose comme ceci :

 "hey\t there   world".gsub(/\s+/, '_') # hey_there_world

Cela obtient des tabulations et de nouvelles lignes ainsi que des espaces et remplace par un seul _ .

L'expression régulière peut être modifiée pour répondre à vos besoins. Par exemple:

 "hey\t there   world".gsub(/\s/, '_') # hey__there___world

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X