2012-11-24 10 views
28

Wie kann ich eine Ruby-Funktion schreiben, die die Eingabe durch einen beliebigen Whitespace teilt und alle Leerzeichen aus dem Ergebnis entfernt? Wenn beispielsweise der EingangRuby split by whitespace

aa bbb 
cc dd ee 

Dann ["aa", "bbb", "cc", "dd", "ee"] ein Array zurück.

Antwort

35

Die folgende sollten Sie gab für das Beispiel arbeiten:

str.gsub(/\s+/m, ' ').strip.split(" ") 

es zurück:

["aa", "bbb", "cc", "dd", "ee"] 

Bedeutung der Code:

/\s+/m ist der kompliziertere Teil. \s bedeutet Leerraum, also \s+ bedeutet ein oder mehrere Leerzeichen. In der /m Teil, m heißt ein Modifikator, in diesem Fall bedeutet es, multiline, was bedeutet, besuchen Sie viele Zeilen, nicht nur eine, die das Standardverhalten ist. Also, /\s+/m bedeutet, finden Sie Sequenzen von einem oder mehreren Leerzeichen.

gsub bedeutet ersetzen alle.

strip ist das Äquivalent von trim in anderen Sprachen und entfernt Leerzeichen am Anfang und am Ende der Zeichenfolge.

Da ich die Erklärung geschrieben habe, könnte es der Fall sein, wo Sie am Ende oder am Anfang der Zeichenfolge mit und End-Line-Zeichen enden.

Um sicher zu sein

Der Code geschrieben werden könnte:

str.gsub(/\s+/m, ' ').gsub(/^\s+|\s+$/m, '').split(" ") 

wenn Sie hatte also:

str = "\n  aa bbb\n cc dd ee\n\n" 

Dann würden Sie erhalten:

["aa", "bbb", "cc", "dd", "ee"] 

Bedeutung des neuen Code:

^\s+ eine Folge von weißen Leerzeichen am Anfang des Strings

\s+$ eine Folge von weißen Leerzeichen am Ende der Zeichenfolge

So gsub(/^\s+|\s+$/m, '') Mittel entfernen beliebige Folge von weißen Leerzeichen am Anfang der Zeichenfolge und am Ende der Zeichenfolge.

+0

Danke für Ihre Antwort, Candide! Würden Sie (oder irgendjemand) etwas dagegen tun, Ihren Code kurz zu erklären? –

+0

@JJBeck siehe Update. – Candide

+0

Rubocop scheitert an der Trennung ("") wegen der doppelten Anführungszeichen. – ablarg

19
input = <<X 
    aa bbb 
cc dd ee 
X 

input.strip.split(/\s+/) 
+0

Oh, das ist sehr einfach, danke! –

5
input.split("\s") 

Wenn "\s" statt /\s/, Weiß-Schritte vom Ergebnis entfernt werden verwendet.

+0

Kann in der Dokumentation nicht gefunden werden. – Nakilon

5

Als eine kleine Änderung an Vidaica Antwort in Ruby 2.1.1 sieht es aus wie

input.split(" ") 

für alle Leerzeichen zu kompensieren, sei es Leerzeichen, Tabulatoren oder Zeilenumbrüche, wodurch man

["aa", "bbb", "cc", "dd", "ee"] 
37

Dies ist das Standardverhalten von String#split:

input = <<-TEXT 
aa bbb 
cc dd ee 
TEXT 

input.split 

Ergebnis:

["aa", "bbb", "cc", "dd", "ee"] 

Das funktioniert in allen Versionen von Ruby, die ich getestet habe, einschließlich 1.8.7, 1.9.3, 2.0.0 und 2.1.2.

+0

So viele komplexe Antworten und die einfachste Antwort ist die beste! – toxaq

+0

Dies sollte die beste Antwort für alle aktuellen Ruby-Versionen sein. Zu der Zeit, als diese Frage gestellt wurde (2012), glaube ich nicht, dass es so möglich war, was die "komplexen Antworten" erklärt. – Shashank

+0

@Shashank Nun, wie ich in der Antwort erwähnt habe, habe ich dies mit Ruby 1.8.7, 1.9.3, 2.0.0 und 2.1.2 getestet, und alle haben genau so funktioniert, wie hier gezeigt. 1.8.7 war bereits im Jahr 2008 veröffentlicht worden, und selbst als diese Frage gestellt wurde, gab es keinen Grund, warum die OP nicht einfach "String # split" verwendet haben könnte. Keine Ahnung, warum das bisher niemand erwähnt hat ... – Ajedi32