Fonction Ruby pour supprimer tous les espaces blancs?

573

Quelle est la fonction Ruby pour supprimer tous les espaces blancs? Je cherche quelque chose comme PHP trim()?

gpwu
la source
36
Votre question n'est pas claire: voulez-vous supprimer tous les espaces blancs ou souhaitez-vous vous débarrasser des espaces blancs de début et de fin?
Sinan Ünür
25
PHP supprime les espaces trim()blancs " du début et de la fin d'une chaîne " (comme indiqué dans la documentation ), il ne supprime pas "tous les espaces blancs".
Tadeck
3
En cas de doute, consultez la documentation en ligne Ruby pour la classe String (voir .strip ci-dessous).
Merovex
2
Notez que toutes les réponses utilisant String#stripou correspondant /\s+/supprimeront uniquement les espaces ASCII. Si vous voulez vous assurer que tout espace non ASCII est également capturé (par exemple HTML &nbsp), consultez la réponse étrangement impopulaire de @EBooker.
MatzFan
1
Dommage que de si bonnes réponses ne puissent pas obtenir la dignité finale d'une personne acceptée
New Alexandria

Réponses:

846

Si vous souhaitez supprimer uniquement les espaces de début et de fin (comme le découpage de PHP), vous pouvez utiliser .strip, mais si vous souhaitez supprimer tous les espaces, vous pouvez utiliser à la.gsub(/\s+/, "")place.

joel.neely
la source
5
"/ \ S + /" signifie-t-il simplement un espace blanc?
Rails débutant
54
\ s + signifie 1 ou plusieurs espaces blancs (espace, nouvelle ligne, tabulation). // l'entourant montre que c'est une expression régulière.
dylanfm
3
Ce n'est pas équivalent à trim ()
Brett Holt
6
bande était exactement ce que je cherchais, merci pour la bonne question et awnser!
Francois
15
@BrettHolt L'expression gsub n'est pas la même chose que trim, mais l'interrogateur a inclus la phrase "tous les espaces blancs", qui n'est pas la même chose que trim non plus. J'ai donc donné des alternatives.
joel.neely
495
s = "I have white space".delete(' ')

Et pour émuler la trim()fonction de PHP :

s = "   I have leading and trailing white space   ".strip
Ed S.
la source
12
c'est beaucoup plus lisible que le regex, pourquoi n'est-il pas aussi populaire?
ckarbass
89
@ckarbass: Parce que beaucoup de gens préfèrent des solutions trop complexes à des problèmes simples. Cela part avec l'expérience.
Ed S.
97
@ckarbass @Ed S. Ce n'est pas aussi populaire car ce n'est pas pareil. La question d'origine utilisait l'expression «tous les espaces blancs», qui comprend des tabulations, des retours à la ligne, etc. Cette réponse proposée ne supprimera pas ces autres caractères d'espaces blancs. Quant à "trop ​​complexe", je suggère de comparer l'expression régulière simple à .delete(' ').delete('\t').delete('\n') ..., qui est trop verbeuse et offre de nombreuses possibilités de fautes de frappe et d'omissions.
joel.neely
13
@ joel.neely: J'ai répondu à cette question il y a longtemps, mais relisez la question, cette fois plus attentivement. L'OP a demandé «une fonction pour supprimer tous les espaces blancs» , mais a ensuite demandé «quelque chose comme PHP trim ()» . Donc, c'est un peu difficile de savoir exactement ce qu'ils veulent ici. trim()ne supprime certainement pas les retours à la ligne et les autres espaces. Vous choisissez une interprétation d'une question vague.
Ed S.
4
@ joel.neely: Cela dit, je suis d'accord qu'une solution qui va au-delà de l'interprétation littérale de la question est meilleure dans ce cas (c'est-à-dire une expression régulière supprimant tous les caractères qui constitueraient un espace plutôt qu'une chaîne d' delete()appels.)
Ed S.
163

Réponse connexe:

"   clean up my edges    ".strip

Retour

"clean up my edges"
jrhicks
la source
C'est celui que j'ai oublié. Je savais qu'il y avait une méthode pour supprimer les espaces blancs qui le ferait par défaut si aucun argument n'était passé. +1
Ed S.
Cela équivaut à la garniture. Veuillez vous référer à la citation de @Tadeck ci-dessus.
Brett Holt
3
S'il existe une possibilité que la variable soit nil, assurez-vous d'exécuter la .to_sméthode avant d'exécuter strip afin que la méthode strip ne génère pas d'erreur. Ex. str=nil; str.to_s.strip #=> ""
scarver2
Je préfère some_data.strip! si some_data.is_a? String
slindsey3000
156

String#strip - supprimer tous les espaces blancs du début et de la fin.

String#lstrip - dès le début.

String#rstrip - juste de la fin.

String#chomp(sans argument) - supprime les séparateurs de ligne ( \nou \r\n) de la fin.

String#chop - supprime le dernier caractère.

String#delete- x.delete(" \t\r\n")- supprime tous les espaces listés.

String#gsub- x.gsub(/[[:space:]]/, '')- supprime tous les espaces, y compris les espaces unicode .


Remarque : Toutes les méthodes ci-dessus renvoient une nouvelle chaîne au lieu de muter l'original. Si vous souhaitez modifier la chaîne en place, appelez la méthode correspondante avec !à la fin.

ndnenkov
la source
L'exemple String # delete semble utiliser une expression régulière, mais \sest entre guillemets au lieu de barres obliques. De plus, je n'ai trouvé aucune mention dans la documentation que la suppression peut prendre une expression régulière comme argument.
slothbear
@slothbear, ce n'est pas une regex, c'est un petit ensemble de motifs qui ressemblent à des regex. Quant à la documentation, #deleteon dit qu'elle fonctionne de manière similaire à #count. Vous pouvez également l'essayer dans la console.
ndnenkov
Merci de m'avoir appris quelque chose de nouveau. Et aussi merci pour le rappel d'essayer les choses dans le plus petit contexte possible (ligne de commande).
slothbear
1
@SeinopSys Je voulais garder cette réponse Ruby uniquement.
ndnenkov
2
Seul le dernier exemple de cette réponse attrape le redoutable ASCII 160 «espace insécable», le fléau des grattoirs à bande. #stripne fait pas. Voir stackoverflow.com/questions/4859438/…
MatzFan
95
"1232 23 2 23 232 232".delete(' ')
=> "123223223232232"

Supprimer fonctionne plus rapidement =)

user         system     total      real
gsub, s      0.180000   0.010000   0.190000 (0.193014)
gsub, s+     0.200000   0.000000   0.200000 (0.196408)
gsub, space  0.220000   0.000000   0.220000 (0.222711)
gsub, join   0.200000   0.000000   0.200000 (0.193478)
delete       0.040000   0.000000   0.040000 (0.045157)
rusllonrails
la source
1
mais cela supprime seulement spaces, pas touswhite spaces
Gavriel
1
delete(" \t\r\n")prendra soin des espaces blancs typiques, et est toujours plus rapide que gsub.
Seth Jeffery
94

Si vous utilisez Rails / ActiveSupport , vous pouvez utiliser la squishméthode. Il supprime les espaces blancs aux deux extrémités de la chaîne et regroupe plusieurs espaces blancs en un seul espace.

Par exemple.

" a  b  c ".squish

résultera en:

"a b c"

Vérifiez cette référence sur api.rubyonrails.org .

Radhika
la source
4
Notez que les réponses en lien uniquement sont déconseillées, les réponses SO devraient être le point final d'une recherche de solution (par rapport à une autre étape de références, qui ont tendance à devenir obsolète au fil du temps). Veuillez envisager d'ajouter un synopsis autonome ici, en conservant le lien comme référence.
kleopatra
2
Je pense que cette réponse était suffisamment expliquée et le fait que le lien était une référence puisque la réponse elle-même était clairement expliquée. Cette fonction était bonne, merci
ksugiarto
4
Cela vient d'ActiveSupport. Vous n'avez pas besoin de tous les Rails pour l'utiliser, mais vous avez au moins besoin d'ActiveSupport et d'unrequire 'active_support/core_ext/string/filters'
Justin Force
2
Pour être clair, il s'agit de n'importe quel espace. Par exemple"a \t \n \f \r \v b".squish == "a b"
Purplejacket
47

Il est un peu tard, mais quiconque googler cette page pourrait être intéressé par cette version -

Si vous souhaitez nettoyer un morceau de texte pré-formaté qu'un utilisateur a peut-être coupé et collé dans votre application, mais conservez l'espacement des mots, essayez ceci:

content = "      a big nasty          chunk of     something

that's been pasted                        from a webpage       or something        and looks 

like      this

"

content.gsub(/\s+/, " ").strip

#=> "a big nasty chunk of something that's been pasted from a webpage or something and looks like this"
Jules Copeland
la source
33
On pourrait également utiliser la squishméthode de Rails : apidock.com/rails/String/squish
Phillip Koebbe
5
Ou si vous n'avez pas de Rails et que vous n'avez pas de nouvelles lignes, cela squeeze(" ")pourrait fonctionner.
Andrew Grimm
45

La .stripméthode de Ruby effectue l'équivalent PHP detrim() .

Pour supprimer tous les espaces:

"  leading    trailing   ".squeeze(' ').strip
=> "leading trailing"

@Tass m'a fait savoir que ma réponse originale supprime les lettres en double successivement - YUCK! Depuis, je suis passé à la méthode squish qui est plus intelligente sur de telles occurrences si vous utilisez le framework Rails.

require 'active_support/all'
"  leading    trailing   ".squish
=> "leading trailing"

"  good    men   ".squish
=> "good men"

Citer: http://apidock.com/rails/String/squish

scarver2
la source
1
Cela supprimera les caractères en double "joints". "good men".squeeze.stripreviendra"god men"
Tass
1
Merci d'avoir signalé @Tass. J'ai modifié ma réponse en faveur de la méthode squish.
scarver2
1
+1 pour "lettres en double successives". Je n'ai pas pu trouver un moyen de décrire le scénario. Bien joué! :-)
Tass
26
" Raheem Shaik ".strip

Il supprime les espaces latéraux gauche et droit. Ce code nous donnerait:"Raheem Shaik"

Copain
la source
20

N'oubliez pas non plus:

$ s = "   I have white space   ".split
=> ["I", "have", "white", "space"]
Justicle
la source
6
Donc, s.split.join fera le travail.
Piotr Brudny
1
C'est agréable lors de l'itération:[" Hello World", "Big Giraffe "].map(&:split).map(&:join) #=> ["HelloWorld", "BigGiraffe"]
tbloncar
20

split.join explosera tous les espaces n'importe où dans la chaîne.

"  a b  c    d     ".split.join
> "abcd"

Il est facile à taper et à mémoriser, il est donc agréable sur la console et pour un piratage rapide. Sans doute pas la bienvenue dans un code sérieux, car cela masque l'intention.

(D'après le commentaire de Piotr dans la réponse de Justicle ci-dessus.)

mahemoff
la source
1
Merci beaucoup pour ce commentaire :-) C'est la seule méthode qui fonctionne si vous avez une longue chaîne qui ressemble à un paragraphe.
Boomerange
12

Vous pourriez essayer ceci

"Some Special Text Values".gsub(/[[:space:]]+/, "")

using : space: supprime l'espace insécable avec l'espace régulier.

EBooker
la source
1
C'est en fait la meilleure réponse à mon humble avis, car dans le HTML sauvage &nbspet tous les autres espaces blancs non ASCII ne seront pas supprimés String#stripou mis en correspondance par /\s/. Voir la section intitulée "Expressions de support POSIX" dans la documentation
Regexp
8

Utilisez gsub ou delete. La différence est que gsub pourrait supprimer des onglets, contrairement à la suppression. Parfois, vous avez des onglets dans des fichiers qui sont ajoutés par les éditeurs.

a = "\tI have some whitespaces.\t"
a.gsub!(/\s/, '')  #=>  "Ihavesomewhitespaces."
a.gsub!(/ /, '')   #=>  "\tIhavesomewhitespaces.\t"
a.delete!(" ")     #=>  "\tIhavesomewhitespaces.\t"
a.delete!("/\s/")  #=>  "\tIhavesomewhitespaces.\t"
a.delete!('/\s/')  #=>  using single quote is unexpected, and you'll get "\tI have ome whitepace.\t"
euccas
la source
8

Il existe plusieurs façons:
Pour supprimer les espaces des deux côtés:

Un peu comme le trim de php ()

Foo_bar.strip

Pour supprimer tous les espaces:

Foo_bar.gsub(/ /, "")

Pour supprimer tous les espaces:

Foo_bar.gsub(/\s/, "")
Sapphire_Brick
la source
6
"asd sda sda sd".gsub(' ', '')
=> "asdsdasdasd"
edikgat
la source
mais cela supprime seulement spaces, pas touswhite spaces
Gavriel
6

La méthode gsub fera très bien l'affaire.
La méthode gsub peut être appelée sur une chaîne et dit:

a = "this is a string"
a = a.gsub(" ","")
puts a
#Output: thisisastring

La méthode gsub recherche chaque occurrence du premier argument et la remplace par le deuxième argument. Dans ce cas, il remplacera chaque espace de la chaîne et le supprimera.

Un autre exemple:

b = "the white fox has a torn tail"

Remplaçons chaque occurrence de la lettre "t" par un "T" majuscule

b = b.gsub("t","T")
puts b 
#Output: The whiTe fox has a Torn Tail
bdbasinger
la source
5

Pour un comportement correspondant exactement à PHP trim, la méthode la plus simple consiste à utiliser la String#stripméthode, comme ceci:

string = "  Many have tried; many have failed!    "
puts "Original [#{string}]:#{string.length}"
new_string = string.strip
puts "Updated  [#{new_string}]:#{new_string.length}"

Ruby a également une version d'édition sur place, appelée String.strip!(notez le "!"). Cela ne nécessite pas de créer une copie de la chaîne et peut être beaucoup plus rapide pour certaines utilisations:

string = "  Many have tried; many have failed!    "
puts "Original [#{string}]:#{string.length}"
string.strip!
puts "Updated  [#{string}]:#{string.length}"

Les deux versions produisent cette sortie:

Original [  Many have tried; many have failed!    ]:40
Updated  [Many have tried; many have failed!]:34

J'ai créé une référence pour tester les performances de certaines utilisations de base de stripet strip!, ainsi que de certaines alternatives. Le test est le suivant:

require 'benchmark'

string = 'asdfghjkl'
Times = 25_000

a = Times.times.map {|n| spaces = ' ' * (1+n/4); "#{spaces}#{spaces}#{string}#{spaces}" }
b = Times.times.map {|n| spaces = ' ' * (1+n/4); "#{spaces}#{spaces}#{string}#{spaces}" }
c = Times.times.map {|n| spaces = ' ' * (1+n/4); "#{spaces}#{spaces}#{string}#{spaces}" }
d = Times.times.map {|n| spaces = ' ' * (1+n/4); "#{spaces}#{spaces}#{string}#{spaces}" }

puts RUBY_DESCRIPTION
puts "============================================================"
puts "Running tests for trimming strings"

Benchmark.bm(20) do |x|
  x.report("s.strip:")                 { a.each {|s| s = s.strip } }
  x.report("s.rstrip.lstrip:")         { a.each {|s| s = s.rstrip.lstrip } }
  x.report("s.gsub:")                  { a.each {|s| s = s.gsub(/^\s+|\s+$/, "") } }
  x.report("s.sub.sub:")               { a.each {|s| s = s.sub(/^\s+/, "").sub(/\s+$/, "") } }

  x.report("s.strip!")                 { a.each {|s| s.strip! } }
  x.report("s.rstrip!.lstrip!:")       { b.each {|s| s.rstrip! ; s.lstrip! } }
  x.report("s.gsub!:")                 { c.each {|s| s.gsub!(/^\s+|\s+$/, "") } }
  x.report("s.sub!.sub!:")             { d.each {|s| s.sub!(/^\s+/, "") ; s.sub!(/\s+$/, "") } }
end

Voici les résultats:

ruby 2.2.5p319 (2016-04-26 revision 54774) [x86_64-darwin14]
============================================================
Running tests for trimming strings
                           user     system      total        real
s.strip:               2.690000   0.320000   3.010000 (  4.048079)
s.rstrip.lstrip:       2.790000   0.060000   2.850000 (  3.110281)
s.gsub:               13.060000   5.800000  18.860000 ( 19.264533)
s.sub.sub:             9.880000   4.910000  14.790000 ( 14.945006)
s.strip!               2.750000   0.080000   2.830000 (  2.960402)
s.rstrip!.lstrip!:     2.670000   0.320000   2.990000 (  3.221094)
s.gsub!:              13.410000   6.490000  19.900000 ( 20.392547)
s.sub!.sub!:          10.260000   5.680000  15.940000 ( 16.411131)
Michael Gaskill
la source
3

Ma préférence personnelle utilise la méthode .tr

un péché:

string = "this is a string to smash together"

string.tr(' ', '') # => "thisisastringtosmashtogether"

Merci à @FrankScmitt d'avoir souligné que pour que cela supprime tous les espaces (pas seulement les espaces), vous devez l'écrire comme tel:

string = "this is a string with tabs\t and a \nnewline"

string.tr(" \n\t", '') # => "thisisastringwithtabsandanewline"
Jeremy Gunter
la source
mais cela supprime seulement spaces, pasall white spaces
Gavriel
Pour supprimer tous les espaces blancs (espace, tabulation, nouvelle ligne), envisagez d'utiliser à la s.tr(" \t\n", '')place.
Frank Schmitt
@Gavriel - J'ai mal lu / mal compris la question, merci de l'avoir signalé.
Jeremy Gunter
@FrankSchmitt J'ai ajouté votre correction à ma réponse, pour mieux répondre à la question du PO. Merci de m'avoir corrigé.
Jeremy Gunter
3

J'essayais de le faire car je voulais utiliser un "titre" de disques comme identifiant dans la vue mais les titres avaient des espaces.

une solution est:

record.value.delete(' ') # Foo Bar -> FooBar
Brad
la source
1

Ruby .scan()et les .join()méthodes de String peuvent également aider à surmonter les espaces blancs dans String.

scan(/\w+/).join supprimera tous les espaces et rejoindra la chaîne

string = "White spaces in me".scan(/\w+/).join
=>"Whitespacesinme"

Il supprime également l'espace des parties gauche et droite de la chaîne. Moyens ltrim, rtrimet trim. Juste au cas où quelqu'un a des antécédents C, FoxProou Visual Basicet sauter Ruby.

2.1.6 :002 > string = " White spaces in me ".scan(/\w+/).join => "Whitespacesinme" 2.1.6 :003 > string = " White spaces in me".scan(/\w+/).join => "Whitespacesinme" 2.1.6 :004 > string = "White spaces in me ".scan(/\w+/).join => "Whitespacesinme" 2.1.6 :005 >

Dharmesh Rupani
la source
1
@AmitPandya Merci beaucoup d'avoir souligné les points clés supplémentaires de la méthode .scan (). Apprécié !!!
Dharmesh Rupani
1

J'utiliserais quelque chose comme ça:

my_string = "Foo bar\nbaz quux"

my_string.split.join
=> "Foobarbazquux"
Artur Okoński
la source
simple. Merci
srikanth peetha
1

Je suis un peu en retard dans le jeu, mais je supprime les espaces de fin et de début en utilisant strip! . Si vous avez un tableau, comme je l'ai fait, je devais parcourir le tableau et l'enregistrer une fois l'instance terminée. Le ! a pris soin de cela. Cela supprimait tous les espaces à la fin ou au début, pas seulement le premier début ou le dernier arrière.

Par exemple:

array = ["hello ","   Melanie", "is", " new ", "to  ", " programming"]
array.each do |i|
  i.strip!
end

Cela produirait à: ["bonjour", "Mélanie", "est", "nouveau", "à", "programmation"]. J'ai encore exploré / partagé cela dans une vidéo que j'ai faite pour mettre en évidence ce code pour une question similaire que j'avais .

Je suis plus récent dans la programmation et l'utilisation de strip n'a pas fonctionné car il ne l'a pas enregistré dans le tableau une fois la boucle terminée.

Mélanie
la source
0

Vous pouvez essayer ceci:

"ab c d efg hi ".split.map(&:strip)

afin d'obtenir ceci:

["ab, "c", "d", "efg", "hi"]

ou si vous voulez une seule chaîne, utilisez simplement:

"ab c d efg hi ".split.join
LvcasX1
la source