Función Ruby para eliminar todos los espacios en blanco?


573

¿Cuál es la función Ruby para eliminar todos los espacios en blanco? Estoy buscando algo así como PHP trim()?


36
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 &nbspde 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.


55
¿"/ \ S + /" simple significa espacio en blanco?
Rails principiante

54
\ 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

12
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)
Ed S.

163

Respuesta relacionada:

"   clean up my edges    ".strip

devoluciones

"clean up my edges"

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#lstrip - Solo desde el principio.

String#rstrip - Solo desde el final.

String#chomp(sin argumentos): elimina los separadores de línea ( \no \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.


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/…
MatzFan

95
"1232 23 2 23 232 232".delete(' ')
=> "123223223232232"

Eliminar funciona más rápido =)

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)

1
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.

Por ej.

" a  b  c ".squish

resultará en:

"a b c"

Verifique esta referencia de api.rubyonrails.org .


44
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"

33
También se podría usar el squishmétodo de Rails : apidock.com/rails/String/squish
Phillip Koebbe

55
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"

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


1
Esto eliminará los caracteres duplicados "unidos". "good men".squeeze.stripvolverá"god men"
Tass

1
Gracias por señalar eso @Tass. He editado mi respuesta a favor del método aplastar.
scarver2

1
+1 para "letras duplicadas en sucesión". No pude encontrar una manera de describir el escenario. ¡Bien hecho! :-)
Tass

26
" Raheem Shaik ".strip

Eliminará los espacios laterales izquierdo y derecho. Este código nos daría:"Raheem Shaik"


20

Tampoco olvides:

$ s = "   I have white space   ".split
=> ["I", "have", "white", "space"]

66
Entonces s.split.join hará el trabajo.
Piotr Brudny

1
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.

(Basado en el comentario de Piotr en la respuesta de Justicle arriba).


1
Muchas, muchas gracias por este comentario :-) Este es el único método que funciona si tienes una cadena larga que parece un párrafo.
Boomerange

12

Podrías probar esto

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

utilizando : espacio: elimina el espacio que no se rompe junto con el espacio normal.


1
En realidad, esta es la mejor respuesta en mi humilde opinión, ya que en el HTML salvaje &nbspy 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"

8

Hay muchas formas:
para eliminar espacios en blanco de ambos lados:

Algo así como el ajuste de php ()

Foo_bar.strip

Para eliminar todos los espacios:

Foo_bar.gsub(/ /, "")

Para eliminar todos los espacios en blanco:

Foo_bar.gsub(/\s/, "")

6
"asd sda sda sd".gsub(' ', '')
=> "asdsdasdasd"

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

5

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!    ]:40
Updated  [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.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)

3

Mi preferencia personal es usar el método .tr

como en:

string = "this is a string to smash together"

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

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:

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

string.tr(" \n\t", '') # => "thisisastringwithtabsandanewline"

pero esto solo elimina spaces, noall white spaces
Gavriel

Para eliminar todos los espacios en blanco (espacio, tabulación, nueva línea), considere usar en su s.tr(" \t\n", '')lugar.
Frank Schmitt

@Gavriel - Leí mal o entendí mal la pregunta, gracias por señalarlo.
Jeremy Gunter

@FrankSchmitt Agregué tu corrección a mi respuesta, para responder más adecuadamente la pregunta del OP. Gracias por corregirme.
Jeremy Gunter

3

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:

record.value.delete(' ') # Foo Bar -> FooBar

1

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 >


1
@AmitPandya Muchas gracias por señalar puntos clave adicionales del método .scan (). Apreciado !!!
Dharmesh Rupani


1

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:

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

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.


0

Puedes probar esto:

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

para obtener esto:

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

o si quieres una sola cadena, solo usa:

"ab c d efg hi ".split.join
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.