2009-03-31 5 views

Antwort

29

Dies funktioniert für mich:

#!/usr/bin/ruby 

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

puts $s 

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

puts $s 
+1

Warum die Klammern? –

+0

Da das vor einem Jahr war, habe ich keine Ahnung. Ich erwarte, dass ich versucht habe,/\ n + /, was ich in Perl verwenden würde, und es hat nicht funktioniert, wahrscheinlich weil ich etwas anderes falsch gemacht habe. –

+0

Ich denke s.gsub! (/ \ N + /, "\ n") funktioniert. Zumindest funktioniert es in meinem Laptop. – swcai

4

sind Sie sicher, dass es nicht \ n \ n \ n /, \ n \ ist, was Sie in Ihrer Frage oben zu haben scheinen.

auch, sind Sie sicher, es ist nicht eine Windows-neue Zeile "\ r \ n"?

EDIT: Zusatzinfo

Per Kommentar

"Die Menge der Zeilenumbrüche ändern können verschiedene Linien zwischen 2 und 5 Zeilenumbrüchen."

, wenn Sie nur die 2-5 Zeilen schlagen versuchen, diese

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

Die Menge der Zeilenumbrüche ändern kann. Verschiedene Zeilen haben zwischen 2 und 5 Zeilenumbrüche. – Macha

+1

Vielen Dank für das Callout '\ r \ n'. Für das, was es wert ist, ist es auch nicht nur Windows - ich habe das bei der Verwendung von Daten von einem Textarea-Eingang auf einer Rails-Site auf meiner Linux-Box erfahren. Zugegeben, andere Faktoren können die Daten ebenfalls beeinflussen, aber der Punkt ist, dass Windows nicht einer von ihnen ist. – DreadPirateShawn

+1

\ r \ n hat perfekt funktioniert. Verbrachte 1,5 Stunden um die perfekte Lösung zu finden und hier ist es. Danke @Keng – sapatelbaps

6

Einfach Splitting und die Linien rekombiniert das gewünschte Ergebnis

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

bearbeiten geben: ich dies gerade bemerkt ersetzt alle Leerzeichen-Substrings durch Zeilenumbrüche, z

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

Zuerst prüfen, ob dies das ist, was Sie wollen!

+0

nett - das ist ein guter Weg, es zu tun! – Brian

+0

Danke, ich habe dies als Antwort ausgewählt, aber dann habe ich festgestellt, dass es auch auf Leerzeichen aufgeteilt ist, was in meinem Fall nicht gut ist. Das tut mir leid. – Macha

+0

Sie haben Recht. Sie könnten str.split (/ \ n + /) aber Chas verwenden. Owens Lösung ist einfacher. – finnw

1

Einfach anrufen Split auch alle Ihre Leerzeichen trimmen.

Sie müssen \n passieren

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

Sie teilen müssen mehr als ein Newline passen zu einer unendlichen Menge von bis.Ihr Codebeispiel wird mit nur einem geringen zwicken arbeiten:

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

Zum Beispiel:

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

Zusätzlich arbeitet auch mit

  • Räumen auf Leerzeilen
  • n Anzahl der zurück Leerzeilen zurücksetzen

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

wo

  • \ n natürlich Neue-Zeile ist
  • \ s ist der Raum
  • bezeichnet 1 oder mehr Leerzeichen bei der Verwendung nach \ s
+0

Dies ist die genaueste Antwort in diesem Thread. –

+0

Kaum einer von diesen adressiert das '\ r' Zeichen. Ich würde dies wie folgt ändern: 'str.gsub (/ [\ n \ r] +^\ s * [\ r \ n] + /," \ n \ n ")' – Dex

9

Verwenden Sie die mehr idiomatische String#squeeze anstelle von gsub.

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

Try This Es ist für mich gearbeitet:

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

s.gsub("\n\n", '') 
Verwandte Themen