Su pregunta no está clara: ¿Desea eliminar todos los espacios en blanco o desea eliminar los espacios en blanco iniciales y finales?
Sinan Ünür
25
El trim()espacio en blanco de las tiras de PHP " desde el principio y el final de una cadena " (como se indica en la documentación ), no elimina "todos los espacios en blanco".
Tadeck
3
En caso de duda, consulte la documentación en línea de Ruby para la clase String (consulte .strip a continuación).
Merovex
2
Tenga en cuenta que todas las respuestas que usan String#stripo coinciden /\s+/eliminarán solo los espacios en blanco ASCII. Si desea asegurarse  de que también se capture cualquier espacio en blanco que no sea ASCII (por ejemplo, HTML ), vea la respuesta extrañamente impopular de @EBooker.
MatzFan
1
Lástima que tan grandes respuestas no pueden conseguir la dignidad final que está siendo aceptada
New Alexandria
Respuestas:
846
Si desea eliminar solo los espacios en blanco iniciales y finales (como el recorte de PHP), puede usarlos .strip, pero si desea eliminar todos los espacios en blanco, puede usarlos .gsub(/\s+/, "")en su lugar.
\ s + significa 1 o más caracteres de espacio en blanco (espacio, nueva línea, tabulación). El // que lo rodea muestra que es una expresión regular.
dylanfm
3
Esto no es equivalente a trim ()
Brett Holt
66
Strip fue exactamente lo que estaba buscando, ¡gracias por una buena pregunta y más!
Francois
15
@BrettHolt La expresión gsub no es lo mismo que recortar, pero el interrogador incluyó la frase "todos los espacios en blanco", que tampoco es lo mismo que recortar. Entonces di alternativas.
joel.neely
495
s ="I have white space".delete(' ')
Y para emular la trim()función de PHP :
s =" I have leading and trailing white space ".strip
Esto es mucho más legible que la expresión regular, ¿por qué no es tan popular?
ckarbass
89
@ckarbass: Porque muchas personas prefieren soluciones demasiado complejas a problemas simples. Se va con la experiencia.
Ed S.
97
@ckarbass @Ed S. No es tan popular porque no es lo mismo. La pregunta original usaba la frase "todos los espacios en blanco", que incluye pestañas, nuevas líneas, etc. Esta respuesta propuesta no eliminará esos otros caracteres de espacios en blanco. En cuanto a "demasiado complejo", sugiero comparar la expresión regular simple con .delete(' ').delete('\t').delete('\n') ..., que es demasiado detallada y ofrece muchas oportunidades para errores tipográficos y de omisión.
joel.neely
13
@ joel.neely: respondí esta pregunta hace mucho tiempo, pero leí la pregunta nuevamente, esta vez con más cuidado. El OP solicitó "una función para eliminar todos los espacios en blanco" , pero luego solicitó "algo como el recorte de PHP ()" . Entonces, es un poco difícil saber exactamente lo que quieren aquí. trim()ciertamente no elimina las nuevas líneas y otros caracteres de espacios en blanco. Estás eligiendo una interpretación de una pregunta vaga.
Ed S.
44
@ joel.neely: Dicho esto, estoy de acuerdo en que una solución que va más allá de la interpretación literal de la pregunta es mejor en este caso (es decir, una expresión regular que elimina todos los caracteres que constituirían espacios en blanco en lugar de una cadena de delete()llamadas)
Ese es el que olvidé. Sabía que había un método para eliminar espacios en blanco que lo haría de forma predeterminada si no se pasaban argumentos. +1
Ed S.
Esto es equivalente a recortar. Consulte la cita de @Tadeck arriba.
Brett Holt
3
Si existe la posibilidad de que la variable sea nil, asegúrese de ejecutar el .to_smétodo antes de ejecutar strip para que el método strip no genere un error. Ex. str=nil; str.to_s.strip #=> ""
scarver2
¡Prefiero some_data.strip! if some_data.is_a? Cadena
slindsey3000
156
String#strip - Eliminar todo el espacio en blanco desde el principio y el final.
String#delete- x.delete(" \t\r\n")- elimina todos los espacios en blanco listados.
String#gsub- x.gsub(/[[:space:]]/, '')- elimina todos los espacios en blanco, incluidos los unicode .
Nota : Todos los métodos anteriores devuelven una nueva cadena en lugar de mutar el original. Si desea cambiar la cadena en su lugar, llame al método correspondiente con !al final.
El ejemplo String # delete parece usar una expresión regular, pero \sestá entre comillas en lugar de barras. Además, no pude encontrar ninguna mención en la documentación que eliminar puede tomar una expresión regular como argumento.
Slothbear
@slothbear, no es una expresión regular, es un pequeño conjunto de patrones que se asemejan a expresiones regulares. En cuanto a la documentación, #deletese dice que funciona de manera similar a #count. También puedes probarlo en la consola.
ndnenkov
Gracias por enseñarme algo nuevo. Y también gracias por el recordatorio de probar cosas en el contexto más pequeño posible (línea de comando).
Slothbear
1
@SeinopSys Quería mantener esta respuesta solo Ruby.
ndnenkov
2
Solo el ejemplo final en esta respuesta capta el temible ASCII 160 'espacio ininterrumpido', la ruina de los raspadores de telaraña. #stripno. Ver 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)
pero esto solo elimina spaces, no todoswhite spaces
Gavriel
1
delete(" \t\r\n")se ocupará del espacio en blanco típico y aún es más rápido que gsub.
Seth Jeffery el
94
Si está utilizando Rails / ActiveSupport , puede usar el squishmétodo. Elimina el espacio en blanco en ambos extremos de la cadena y agrupa múltiples espacios en blanco en un solo espacio.
Tenga en cuenta que se desaconsejan las respuestas de solo enlace , las respuestas SO deben ser el punto final de una búsqueda de una solución (frente a otra escala de referencias, que tienden a quedarse obsoletas con el tiempo). Considere agregar una sinopsis independiente aquí, manteniendo el enlace como referencia.
kleopatra
2
Creo que esta respuesta fue suficientemente explicada y el hecho de que el enlace era una referencia ya que la respuesta en sí misma estaba claramente explicada. Esta función fue buena, gracias
ksugiarto
44
Esto es de ActiveSupport. No necesita todos los Rails para usarlo, pero sí necesita al menos ActiveSupport y unrequire 'active_support/core_ext/string/filters'
Justin Force
2
Para ser claros, este es cualquier espacio en blanco. Ej ."a \t \n \f \r \v b".squish == "a b"
Purplejacket
47
Es un poco tarde, pero cualquier otra persona que busque en Google esta página podría estar interesada en esta versión.
Si desea limpiar una porción de texto preformateado que un usuario puede haber cortado y pegado en su aplicación de alguna manera, pero preservar el espacio entre palabras, intente esto:
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"
O si no tiene Rails, y no tiene líneas nuevas, squeeze(" ")podría funcionar.
Andrew Grimm
45
El .stripmétodo de Ruby realiza el equivalente de PHP atrim() .
Para eliminar todos los espacios en blanco:
" leading trailing ".squeeze(' ').strip
=>"leading trailing"
@Tass me hizo saber que mi respuesta original elimina las letras duplicadas en sucesión - ¡YUCK! Desde entonces, cambié al método de compresión que es más inteligente sobre tales ocurrencias si utilizo el marco Rails.
require 'active_support/all'" leading trailing ".squish
=>"leading trailing"" good men ".squish
=>"good men"
Esto es bueno cuando se itera:[" Hello World", "Big Giraffe "].map(&:split).map(&:join) #=> ["HelloWorld", "BigGiraffe"]
tbloncar
20
split.join explotará todos los espacios en cualquier lugar de la cadena.
" a b c d ".split.join
>"abcd"
Es fácil de escribir y recordar, por lo que es agradable en la consola y para un pirateo rápido. Podría decirse que no es bienvenido en un código serio, ya que oculta la intención.
En realidad, esta es la mejor respuesta en mi humilde opinión, ya que en el HTML salvaje  y cualquier otro espacio en blanco que no sea ASCII no se eliminará String#stripni coincidirá /\s/. Consulte la sección titulada "Expresiones de corchetes POSIX" en los documentos de Regexp
MatzFan
8
Usa gsub o delete. La diferencia es que gsub podría eliminar pestañas, mientras que eliminar no puede. A veces tienes pestañas en los archivos que los editores agregan.
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"
pero esto solo elimina spaces, no todowhite spaces
Gavriel
6
El método gsub funcionará bien.
El método gsub se puede invocar en una cadena y dice:
a ="this is a string"
a = a.gsub(" ","")
puts a
#Output: thisisastring
El método gsub busca cada aparición del primer argumento y lo reemplaza con el segundo argumento. En este caso, reemplazará cada espacio dentro de la cadena y lo eliminará.
Otro ejemplo:
b ="the white fox has a torn tail"
Reemplacemos cada aparición de la letra "t" con una "T" mayúscula
b = b.gsub("t","T")
puts b
#Output: The whiTe fox has a Torn Tail
Para un comportamiento que coincida exactamente con PHP trim, el método más simple es usar el String#stripmétodo, así:
string =" Many have tried; many have failed! "
puts "Original [#{string}]:#{string.length}"
new_string = string.strip
puts "Updated [#{new_string}]:#{new_string.length}"
Ruby también tiene una versión de edición en el lugar, también llamada String.strip!(tenga en cuenta el final '!'). Esto no requiere crear una copia de la cadena, y puede ser significativamente más rápido para algunos usos:
string =" Many have tried; many have failed! "
puts "Original [#{string}]:#{string.length}"
string.strip!
puts "Updated [#{string}]:#{string.length}"
Ambas versiones producen esta salida:
Original[Many have tried; many have failed!]:40Updated[Many have tried; many have failed!]:34
Creé un punto de referencia para probar el rendimiento de algunos usos básicos de stripy strip!, así como algunas alternativas. La prueba es esta:
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
Estos son los resultados:
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()y los .join()métodos de String también pueden ayudar a superar los espacios en blanco en la cadena.
scan(/\w+/).join eliminará todos los espacios y unirá la cadena
string ="White spaces in me".scan(/\w+/).join
=>"Whitespacesinme"
También está eliminando espacio de la parte izquierda y derecha de la cadena. Medios ltrim, rtrimy trim. Por si acaso, si alguien tiene más de fondo C, FoxProo Visual Basicy saltar en 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 >
Llego un poco tarde al juego, pero elimino los espacios en blanco iniciales y finales mediante el uso de strip! . Si tiene una matriz, como yo, necesitaba iterar a través de la matriz y guardarla después de que finalizara la instancia. Los ! se encargó de esto. Esto eliminó todos los espacios en blanco al final o al principio, no solo el primer inicio o el último final.
trim()
espacio en blanco de las tiras de PHP " desde el principio y el final de una cadena " (como se indica en la documentación ), no elimina "todos los espacios en blanco".String#strip
o coinciden/\s+/
eliminarán solo los espacios en blanco ASCII. Si desea asegurarse 
de que también se capture cualquier espacio en blanco que no sea ASCII (por ejemplo, HTML ), vea la respuesta extrañamente impopular de @EBooker.Respuestas:
Si desea eliminar solo los espacios en blanco iniciales y finales (como el recorte de PHP), puede usarlos
.strip
, pero si desea eliminar todos los espacios en blanco, puede usarlos.gsub(/\s+/, "")
en su lugar.fuente
Y para emular la
trim()
función de PHP :fuente
.delete(' ').delete('\t').delete('\n') ...
, que es demasiado detallada y ofrece muchas oportunidades para errores tipográficos y de omisión.trim()
ciertamente no elimina las nuevas líneas y otros caracteres de espacios en blanco. Estás eligiendo una interpretación de una pregunta vaga.delete()
llamadas)Respuesta relacionada:
devoluciones
fuente
nil
, asegúrese de ejecutar el.to_s
método antes de ejecutar strip para que el método strip no genere un error. Ex.str=nil; str.to_s.strip #=> ""
String#strip
- Eliminar todo el espacio en blanco desde el principio y el final.String#lstrip
- Solo desde el principio.String#rstrip
- Solo desde el final.String#chomp
(sin argumentos): elimina los separadores de línea (\n
o\r\n
) del final.String#chop
- elimina el último personaje.String#delete
-x.delete(" \t\r\n")
- elimina todos los espacios en blanco listados.String#gsub
-x.gsub(/[[:space:]]/, '')
- elimina todos los espacios en blanco, incluidos los unicode .Nota : Todos los métodos anteriores devuelven una nueva cadena en lugar de mutar el original. Si desea cambiar la cadena en su lugar, llame al método correspondiente con
!
al final.fuente
\s
está entre comillas en lugar de barras. Además, no pude encontrar ninguna mención en la documentación que eliminar puede tomar una expresión regular como argumento.#delete
se dice que funciona de manera similar a#count
. También puedes probarlo en la consola.#strip
no. Ver stackoverflow.com/questions/4859438/…Eliminar funciona más rápido =)
fuente
spaces
, no todoswhite spaces
delete(" \t\r\n")
se ocupará del espacio en blanco típico y aún es más rápido que gsub.Si está utilizando Rails / ActiveSupport , puede usar el
squish
método. Elimina el espacio en blanco en ambos extremos de la cadena y agrupa múltiples espacios en blanco en un solo espacio.Por ej.
resultará en:
Verifique esta referencia de api.rubyonrails.org .
fuente
require 'active_support/core_ext/string/filters'
"a \t \n \f \r \v b".squish == "a b"
Es un poco tarde, pero cualquier otra persona que busque en Google esta página podría estar interesada en esta versión.
Si desea limpiar una porción de texto preformateado que un usuario puede haber cortado y pegado en su aplicación de alguna manera, pero preservar el espacio entre palabras, intente esto:
fuente
squish
método de Rails : apidock.com/rails/String/squishsqueeze(" ")
podría funcionar.El
.strip
método de Ruby realiza el equivalente de PHP atrim()
.Para eliminar todos los espacios en blanco:
@Tass me hizo saber que mi respuesta original elimina las letras duplicadas en sucesión - ¡YUCK! Desde entonces, cambié al método de compresión que es más inteligente sobre tales ocurrencias si utilizo el marco Rails.
Cita: http://apidock.com/rails/String/squish
fuente
"good men".squeeze.strip
volverá"god men"
Eliminará los espacios laterales izquierdo y derecho. Este código nos daría:
"Raheem Shaik"
fuente
Tampoco olvides:
fuente
[" Hello World", "Big Giraffe "].map(&:split).map(&:join) #=> ["HelloWorld", "BigGiraffe"]
split.join
explotará todos los espacios en cualquier lugar de la cadena.Es fácil de escribir y recordar, por lo que es agradable en la consola y para un pirateo rápido. Podría decirse que no es bienvenido en un código serio, ya que oculta la intención.
(Basado en el comentario de Piotr en la respuesta de Justicle arriba).
fuente
Podrías probar esto
utilizando : espacio: elimina el espacio que no se rompe junto con el espacio normal.
fuente
 
y cualquier otro espacio en blanco que no sea ASCII no se eliminaráString#strip
ni coincidirá/\s/
. Consulte la sección titulada "Expresiones de corchetes POSIX" en los documentos de RegexpUsa gsub o delete. La diferencia es que gsub podría eliminar pestañas, mientras que eliminar no puede. A veces tienes pestañas en los archivos que los editores agregan.
fuente
Hay muchas formas:
para eliminar espacios en blanco de ambos lados:
Para eliminar todos los espacios:
Para eliminar todos los espacios en blanco:
fuente
fuente
spaces
, no todowhite spaces
El método gsub funcionará bien.
El método gsub se puede invocar en una cadena y dice:
El método gsub busca cada aparición del primer argumento y lo reemplaza con el segundo argumento. En este caso, reemplazará cada espacio dentro de la cadena y lo eliminará.
Otro ejemplo:
Reemplacemos cada aparición de la letra "t" con una "T" mayúscula
fuente
Para un comportamiento que coincida exactamente con PHP
trim
, el método más simple es usar elString#strip
método, así:Ruby también tiene una versión de edición en el lugar, también llamada
String.strip!
(tenga en cuenta el final '!'). Esto no requiere crear una copia de la cadena, y puede ser significativamente más rápido para algunos usos:Ambas versiones producen esta salida:
Creé un punto de referencia para probar el rendimiento de algunos usos básicos de
strip
ystrip!
, así como algunas alternativas. La prueba es esta:Estos son los resultados:
fuente
Mi preferencia personal es usar el método
.tr
como en:
Gracias a @FrankScmitt por señalar que para hacer que esto elimine todos los espacios en blanco (no solo los espacios), deberá escribirlo como tal:
fuente
spaces
, noall white spaces
s.tr(" \t\n", '')
lugar.Estaba tratando de hacer esto porque quería usar un "título" de registros como id en la vista, pero los títulos tenían espacios.
una solución es:
fuente
Ruby
.scan()
y los.join()
métodos de String también pueden ayudar a superar los espacios en blanco en la cadena.scan(/\w+/).join
eliminará todos los espacios y unirá la cadenaTambién está eliminando espacio de la parte izquierda y derecha de la cadena. Medios
ltrim
,rtrim
ytrim
. Por si acaso, si alguien tiene más de fondoC
,FoxPro
oVisual Basic
y saltar enRuby
.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 >
fuente
Yo usaría algo como esto:
fuente
Llego un poco tarde al juego, pero elimino los espacios en blanco iniciales y finales mediante el uso de
strip!
. Si tiene una matriz, como yo, necesitaba iterar a través de la matriz y guardarla después de que finalizara la instancia. Los ! se encargó de esto. Esto eliminó todos los espacios en blanco al final o al principio, no solo el primer inicio o el último final.Por ejemplo:
Esto daría como resultado: ["hola", "Melanie", "es", "nuevo", "a", "programación"]. Exploré / compartí esto en un video que hice para resaltar este código para una pregunta similar que tenía .
Soy nuevo en la programación y el uso de strip no funcionó, ya que no lo guardó en la matriz después de que finalizó el ciclo.
fuente
Puedes probar esto:
para obtener esto:
o si quieres una sola cadena, solo usa:
fuente