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  ), 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.
"/ \ 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
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.)
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#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.
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/…
user system total real
gsub, s 0.1800000.0100000.190000(0.193014)
gsub, s+0.2000000.0000000.200000(0.196408)
gsub, space 0.2200000.0000000.220000(0.222711)
gsub, join 0.2000000.0000000.200000(0.193478)
delete 0.0400000.0000000.040000(0.045157)
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.
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"
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"
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.
C'est en fait la meilleure réponse à mon humble avis, car dans le HTML sauvage  et 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"
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
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!]:40Updated[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.6900000.3200003.010000(4.048079)
s.rstrip.lstrip:2.7900000.0600002.850000(3.110281)
s.gsub:13.0600005.80000018.860000(19.264533)
s.sub.sub:9.8800004.91000014.790000(14.945006)
s.strip!2.7500000.0800002.830000(2.960402)
s.rstrip!.lstrip!:2.6700000.3200002.990000(3.221094)
s.gsub!:13.4100006.49000019.900000(20.392547)
s.sub!.sub!:10.2600005.68000015.940000(16.411131)
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 >
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.
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.
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".String#strip
ou correspondant/\s+/
supprimeront uniquement les espaces ASCII. Si vous voulez vous assurer que tout espace non ASCII est également capturé (par exemple HTML 
), consultez la réponse étrangement impopulaire de @EBooker.Réponses:
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.la source
Et pour émuler la
trim()
fonction de PHP :la source
.delete(' ').delete('\t').delete('\n') ...
, qui est trop verbeuse et offre de nombreuses possibilités de fautes de frappe et d'omissions.trim()
ne supprime certainement pas les retours à la ligne et les autres espaces. Vous choisissez une interprétation d'une question vague.delete()
appels.)Réponse connexe:
Retour
la source
nil
, assurez-vous d'exécuter la.to_s
mé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 #=> ""
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 (\n
ou\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.la source
\s
est 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.#delete
on dit qu'elle fonctionne de manière similaire à#count
. Vous pouvez également l'essayer dans la console.#strip
ne fait pas. Voir stackoverflow.com/questions/4859438/…Supprimer fonctionne plus rapidement =)
la source
spaces
, pas touswhite spaces
delete(" \t\r\n")
prendra soin des espaces blancs typiques, et est toujours plus rapide que gsub.Si vous utilisez Rails / ActiveSupport , vous pouvez utiliser la
squish
mé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.
résultera en:
Vérifiez cette référence sur api.rubyonrails.org .
la source
require 'active_support/core_ext/string/filters'
"a \t \n \f \r \v b".squish == "a b"
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:
la source
squish
méthode de Rails : apidock.com/rails/String/squishsqueeze(" ")
pourrait fonctionner.La
.strip
méthode de Ruby effectue l'équivalent PHP detrim()
.Pour supprimer tous les espaces:
@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.
Citer: http://apidock.com/rails/String/squish
la source
"good men".squeeze.strip
reviendra"god men"
Il supprime les espaces latéraux gauche et droit. Ce code nous donnerait:
"Raheem Shaik"
la source
N'oubliez pas non plus:
la source
[" Hello World", "Big Giraffe "].map(&:split).map(&:join) #=> ["HelloWorld", "BigGiraffe"]
split.join
explosera tous les espaces n'importe où dans la chaîne.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.)
la source
Vous pourriez essayer ceci
using : space: supprime l'espace insécable avec l'espace régulier.
la source
 
et tous les autres espaces blancs non ASCII ne seront pas supprimésString#strip
ou mis en correspondance par/\s/
. Voir la section intitulée "Expressions de support POSIX" dans la documentationUtilisez 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.
la source
Il existe plusieurs façons:
Pour supprimer les espaces des deux côtés:
Pour supprimer tous les espaces:
Pour supprimer tous les espaces:
la source
la source
spaces
, pas touswhite spaces
La méthode gsub fera très bien l'affaire.
La méthode gsub peut être appelée sur une chaîne et dit:
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:
Remplaçons chaque occurrence de la lettre "t" par un "T" majuscule
la source
Pour un comportement correspondant exactement à PHP
trim
, la méthode la plus simple consiste à utiliser laString#strip
méthode, comme ceci: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:Les deux versions produisent cette sortie:
J'ai créé une référence pour tester les performances de certaines utilisations de base de
strip
etstrip!
, ainsi que de certaines alternatives. Le test est le suivant:Voici les résultats:
la source
Ma préférence personnelle utilise la méthode
.tr
un péché:
Merci à @FrankScmitt d'avoir souligné que pour que cela supprime tous les espaces (pas seulement les espaces), vous devez l'écrire comme tel:
la source
spaces
, pasall white spaces
s.tr(" \t\n", '')
place.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:
la source
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îneIl supprime également l'espace des parties gauche et droite de la chaîne. Moyens
ltrim
,rtrim
ettrim
. Juste au cas où quelqu'un a des antécédentsC
,FoxPro
ouVisual Basic
et sauterRuby
.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 >
la source
J'utiliserais quelque chose comme ça:
la source
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:
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.
la source
Vous pouvez essayer ceci:
afin d'obtenir ceci:
ou si vous voulez une seule chaîne, utilisez simplement:
la source