2011-01-11 14 views
26

No estoy seguro de cómo hacer esto, ya que soy bastante nuevo en las expresiones regulares, y no puedo encontrar el método adecuado para lograr esto, pero digo que tengo lo siguiente como string (todos los tabuladores y saltos de línea incluidos)Ruby reducir todos los espacios en blanco a espacios individuales

1/2 cup 




      onion   
      (chopped) 

¿Cómo puedo eliminar todos los espacios en blanco y reemplace cada instancia con apenas un solo espacio?

Respuesta

53

Este es un caso en que las expresiones regulares funcionan bien, porque quiere tratar a toda la clase de caracteres de espacio en blanco del mismo y reemplazar carreras de cualquier combinación de espacio en blanco con una personaje de espacio simple. Así que si esa cadena se almacena en s, a continuación, puede hacer:

fixed_string = s.gsub(/\s+/, ' ') 
+1

Esta es la respuesta correcta. Y un buen nombre, podría agregar . :) –

8

desea que el método de compresión:

str.squeeze([other_str]*) → new_str 
Builds a set of characters from the other_str parameter(s) using the procedure described for String#count. Returns a new string where runs of the same character that occur in this set are replaced by a single character. If no arguments are given, all runs of identical characters are replaced by a single character. 

    "yellow moon".squeeze     #=> "yelow mon" 
    " now is the".squeeze(" ")   #=> " now is the" 
    "putters shoot balls".squeeze("m-z") #=> "puters shot balls" 
+1

Esto no es del todo correcto, creo. Simplemente comprimirá corridas de pestañas en una sola pestaña y ejecutará nuevas líneas en una sola nueva línea. Mientras lo leo, la pregunta es buscar una forma de reemplazar las ejecuciones de cualquier combinación de caracteres en espacios en blanco con un solo carácter de espacio. – Chuck

+0

Lástima que 'String.squeeze' no acepte regex como argumento. Vota si crees que sería una buena idea; Podría enviar un PR – the911s

+2

también esto elimina duplicados, ej. "clase" se convierte en "clas", lo que podría ser un factor decisivo si se ejecuta esto en html. El método más adecuado (si está en los rieles) sería String # squish – engineerDave

3

La respuesta seleccionada no eliminará non-breaking space caracteres.

Esto debería funcionar en 1.9:

fixed_string = s.gsub(/(\s|\u00A0)+/, ' ')

+0

Supongo que OP quería eliminar espacios en blanco sin sentido (es decir, ejecuciones de más de un carácter de espacio en blanco) para ordenar y reducir el tamaño de cadenas destinadas a HTML, ya que varios navegadores de espacios en blanco consecutivos se colapsan en un espacio por navegadores web de todos modos ... Vale la pena señalar que los espacios sin interrupción no tienen sentido en HTML, no se colapsan, es decir, es probable que no quieras eliminarlos – callum

4

El problema con la solución más simple gsub(/\s+/, ' ') es que es muy lento, ya que sustituye cada espacio, aunque sea solo. Pero generalmente hay 1 espacio entre palabras y debemos corregirlo solo si hay 2 o más espacios en blanco en secuencia.

mejor solución es gsub(/[\r\n\t]/, ' ').gsub(/ {2,}/, ' ') - primero deshacerse de espacios en blanco especiales y luego apretar espacio normal

def method1(s) s.gsub!(/\s+/, ' '); s end 
def method2(s) s.gsub!(/[\r\n\t]/, ' '); s.gsub!(/ {2,}/, ' '); s end 

Benchmark.bm do |x| 
    n = 100_000 
    x.report('method1') { n.times { method1("Lorem ipsum\n\n dolor \t\t\tsit amet, consectetur\n \n\t\n adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.") } } 
    x.report('method2') { n.times { method2("Lorem ipsum\n\n dolor \t\t\tsit amet, consectetur\n \n\t\n adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.") } } 
end;1 

#  user  system  total  real 
# method1 4.090000 0.010000 4.100000 ( 4.124844) 
# method2 1.590000 0.010000 1.600000 ( 1.611443) 
11

Dentro de los carriles se pueden utilizar String#squish, que es un active_support extensiones.

require 'active_support' 

s = <<-EOS 
1/2 cup 

      onion 
EOS 

s.squish 
# => 1/2 cup onion 
Cuestiones relacionadas