web-dev-qa-db-fra.com

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

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 supprimées

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

65
rugbert

Les documents pour tr! say

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.

36
rwilliams

avec espace

str = "New School"
str.parameterize.underscore

=> "new_school"

sans espace

str = "school"
str.parameterize.underscore

=> "school"

Edit: - on peut aussi passer '_' comme paramètre à paramétrer.

avec espace

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

=> "new_school"

sans espace

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

=> "school"
95
Sampat Badhe

Si vous souhaitez obtenir une chaîne dans cas de serpent , 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/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

36
Zack Xu

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

str.parameterize(separator: '_')
10
theterminalguy

Vieille question, mais ...

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

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

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

Le regex peut être modifié selon vos besoins. Par exemple:

"hey\t there   world".gsub(/\s/, '_') # hey__there___world
8
br3nt
str.downcase.tr(" ", "_")

Remarque: pas de "!"

6
Michael Durrant
str = "Foo Bar"
str.tr(' ','').underscore

=> "foo_bar"
2
Trip

Vous pouvez également faire str.gsub ("", "_")

1
randomuser