2009-03-31 12 views

Respuesta

29

Esto funciona para mí:

#!/usr/bin/ruby 

$s = "foo\n\n\nbar\nbaz\n\n\nquux"; 

puts $s 

$s.gsub!(/[\n]+/, "\n"); 

puts $s 
+1

¿Por qué los soportes? –

+0

Desde que fue hace un año, no tengo ni idea. Supongo que probé/\ n + /, ya que eso es lo que usaría en Perl, y no funcionó para mí, probablemente porque hice algo incorrecto. –

+0

Creo que s.gsub! (/ \ N + /, "\ n") funciona. Al menos funciona en mi computadora portátil. – swcai

4

¿Estás seguro de que no debería ser/\ n \ n \ n /, "\ n" lo que pareces querer en tu pregunta anterior?

también, ¿estás seguro de que no está haciendo una nueva línea de Windows "\ r \ n"?

EDIT: Otros detalles

Per comentario

"La cantidad de saltos de línea se puede cambiar Diferentes líneas tienen entre 2 y 5 saltos de línea".

si solo deseas para golpear las líneas 2-5 a probar esto

/\n{2,5}/, "\n" 
+0

La cantidad de saltos de línea se puede cambiar. Las diferentes líneas tienen entre 2 y 5 nuevas líneas. – Macha

+1

Muchas gracias por la llamada '\ r \ n'. Por lo que vale, tampoco es solo Windows, me encontré con esto cuando uso datos de una entrada de texto en un sitio de Rails en mi caja de Linux. Por supuesto, otros factores también pueden estar afectando los datos, pero el hecho es que Windows no es uno de ellos. – DreadPirateShawn

+1

\ r \ n funcionó a la perfección. Pasé 1.5hr para encontrar la solución perfecta y aquí está. Gracias @Keng – sapatelbaps

6

simplemente dividir y recombinar las líneas dará el resultado deseado

>> "one\ntwo\n\nthree\n".split.join("\n") 
=> "one\ntwo\nthree" 

Editar: Acabo de notar esta reemplazará TODAS las subcadenas de espacios en blanco con nuevas líneas, por ejemplo

>> "one two three\n".split.join("\n") 
=> "one\ntwo\nthree" 

¡Primero compruebe que esto es lo que quiere!

+0

bueno, esa es una gran manera de hacerlo! – Brian

+0

Gracias, seleccioné esto como la respuesta, pero luego me di cuenta de que también se divide en espacios, lo cual no es bueno en mi caso. Lo siento por eso. – Macha

+0

Tienes razón. Puede usar str.split (/ \ n + /) pero Chas. La solución de Owens es más simple. – finnw

1

dividida simplemente llamando también recortar la totalidad de su espacio en blanco.

lo necesario para pasar \n dividir

>> "one ok \ntwo\n\nthree\n".split(/\n+/).join("\n") 
=> "one ok \ntwo\nthree" 
5

Es necesario que coincidan más de una línea nueva hasta una cantidad infinita.Su ejemplo de código puede funcionar con sólo un pequeño ajuste:

str.gsub!(/\n+/, "\n") 

Por ejemplo:

str = "this\n\n\nis\n\n\n\n\na\ntest" 
str.gsub!(/\n+/, "\n") # => "this\nis\na\ntest" 
1

Además, también funciona con

  • espacios en las líneas en blanco
  • un número n de vuelta para respaldar las líneas en blanco

str.gsub!/\ N^\ s * \ n /, "\ n \ n"

donde,

  • \ n es de nueva línea curso
  • \ s es el espacio
  • denota 1 o más espacios junto cuando se usa después de \ s
+0

Esta es la respuesta más precisa en este hilo. –

+0

Casi ninguno de estos aborda el caracter '\ r'. Me gustaría modificar esto a lo siguiente: 'str.gsub (/ [\ n \ r] +^\ s * [\ r \ n] + /," \ n \ n ")' – Dex

9

Utilice el más idiomático String#squeeze en lugar de gsub.

str = "a\n\n\nb\n\n\n\n\n\nc" 
str.squeeze("\n") # => "a\nb\nc" 
-1

intenta esto funcionó para mí:

s = test\n\n\nbar\n\n\nfooo 

s.gsub("\n\n", '') 
Cuestiones relacionadas