Teilen von Strings in Ruby mit der String # split-Methode

Sofern es sich bei der Benutzereingabe nicht um ein einzelnes Wort oder eine einzelne Zahl handelt, muss diese Eingabe aufgeteilt oder in eine Liste von Zeichenfolgen oder Zahlen umgewandelt werden.

Wenn ein Programm beispielsweise nach Ihrem vollständigen Namen einschließlich der mittleren Initiale fragt, muss es diese Eingabe zunächst in drei separate Zeichenfolgen aufteilen, bevor es mit Ihrem individuellen Vor-, Mittel- und Nachnamen arbeiten kann. Dies geschieht mit dem String # split Methode.

So funktioniert String # split

In seiner einfachsten Form, String # split Nimmt ein einziges Argument: den Feldbegrenzer als Zeichenfolge. Dieses Trennzeichen wird aus der Ausgabe entfernt und ein auf das Trennzeichen aufgeteiltes Array von Zeichenfolgen wird zurückgegeben.

Wenn der Benutzer im folgenden Beispiel seinen Namen korrekt eingibt, sollte er ein Drei-Elemente-Element erhalten Array von der Spaltung.

#! / usr / bin / env ruby
print "Wie lautet Ihr vollständiger Name?"
full_name = gets.chomp
name = full_name.split (")
setzt "Ihr Vorname ist # name.first"
setzt "Ihr Nachname ist # name.last"

Wenn wir dieses Programm ausführen und einen Namen eingeben, erhalten wir einige erwartete Ergebnisse. Beachten Sie auch, dass Name zuerst und name.last sind Zufälle. Das Name Variable wird eine sein Array, und diese beiden Methodenaufrufe sind äquivalent zu name [0] und name [-1] beziehungsweise.

$ ruby ​​split.rb
Wie lautet Dein voller Name? Michael C. Morin
Ihr Vorname ist Michael
Ihr Nachname ist Morin

jedoch, String # split ist ein bisschen schlauer als man denkt. Wenn das Argument zu String # split Ist eine Zeichenfolge, wird diese zwar als Trennzeichen verwendet. Wenn das Argument jedoch eine Zeichenfolge mit einem einzelnen Leerzeichen ist (wie wir es verwendet haben), wird der Schluss gezogen, dass Sie eine beliebige Menge an Leerzeichen teilen möchten und dass Sie auch entfernen möchten beliebiges führendes Leerzeichen.

Also, wenn wir es etwas missgebildeten Input wie geben würden

Michael C. Morin

(mit zusätzlichen Leerzeichen) String # split würde immer noch tun, was erwartet wird. Dies ist jedoch der einzige Sonderfall, wenn Sie an einem vorbeigehen String als erstes argument. Begrenzer für reguläre Ausdrücke

Sie können auch einen regulären Ausdruck als erstes Argument übergeben. Hier, String # split wird etwas flexibler. Wir können unseren kleinen Namensaufteilungscode auch ein bisschen schlauer machen.

Wir wollen nicht, dass die Periode am Ende der mittleren Initiale steht. Wir wissen, dass es sich um eine mittlere Initiale handelt und die Datenbank dort keinen Punkt haben möchte, sodass wir ihn entfernen können, während wir uns trennen. Wann String # split Wenn es mit einem regulären Ausdruck übereinstimmt, geschieht genau das Gleiche, als hätte es gerade mit einem Zeichenfolgenbegrenzer überein- gestimmt: Es nimmt es aus der Ausgabe und teilt es an diesem Punkt auf.

So können wir unser Beispiel ein wenig weiterentwickeln:

$ cat split.rb
#! / usr / bin / env ruby
print "Wie lautet Ihr vollständiger Name?"
full_name = gets.chomp
name = full_name.split (/ \.? \ s + /)
setzt "Ihr Vorname ist # name.first"
setzt "Ihre mittlere Initiale ist # name [1]"
setzt "Ihr Nachname ist # name.last"

Standard-Datensatztrennzeichen

Ruby ist nicht besonders auf "spezielle Variablen" spezialisiert, die Sie vielleicht in Sprachen wie Perl finden, aber String # split verwendet eine, die Sie beachten müssen. Dies ist die Standardvariable für Datensatztrennzeichen, auch bekannt als $;.

Es ist ein globales Element, das in Ruby nicht oft vorkommt. Wenn Sie es ändern, kann es sich auf andere Teile des Codes auswirken. Sie müssen es nur zurücksetzen, wenn Sie fertig sind.

Diese Variable fungiert jedoch nur als Standardwert für das erste Argument von String # split. Standardmäßig scheint diese Variable auf gesetzt zu sein Null. jedoch, wenn String # splitDas erste Argument ist Null, Es wird durch eine einzelne Leerzeichenfolge ersetzt.

Nulllängenbegrenzer

Wenn das Trennzeichen an übergeben wurde String # split ist also eine Zeichenfolge mit der Länge Null oder ein regulärer Ausdruck String # split wird sich ein bisschen anders verhalten. Es wird überhaupt nichts aus der ursprünglichen Zeichenfolge entfernt und auf jedes Zeichen aufgeteilt. Dadurch wird die Zeichenfolge im Wesentlichen in ein Array gleicher Länge umgewandelt, das nur Zeichenfolgen mit einem Zeichen enthält, eine für jedes Zeichen in der Zeichenfolge.

Dies kann nützlich sein, um über die Zeichenfolge zu iterieren, und wurde in den Versionen vor 1.9.x und 1.8.7 (die eine Reihe von Funktionen von 1.9.x zurückportierten) verwendet, um Zeichen in einer Zeichenfolge zu iterieren, ohne sich Gedanken darüber zu machen, Byte Unicode-Zeichen. Wenn Sie jedoch wirklich über eine Zeichenfolge iterieren möchten und 1.8.7 oder 1.9.x verwenden, sollten Sie wahrscheinlich verwenden String # each_char stattdessen.

#! / usr / bin / env ruby
str = "Sie hat mich in einen Molch verwandelt!"
str.split ("). each do | c |
setzt c
Ende

Begrenzen der Länge des zurückgegebenen Arrays

Zurück zu unserem Beispiel zum Analysieren von Namen: Was ist, wenn jemand ein Leerzeichen in seinem Nachnamen hat? Zum Beispiel können niederländische Nachnamen oft mit "van" beginnen (was "von" oder "von" bedeutet).

Wir wollen wirklich nur ein 3-Element-Array, also können wir das zweite Argument dazu verwenden String # split das haben wir bisher ignoriert. Das zweite Argument ist a Fixnum. Wenn dieses Argument positiv ist, werden höchstens so viele Elemente in das Array eingefügt. In unserem Fall möchten wir also 3 für dieses Argument übergeben.

#! / usr / bin / env ruby
print "Wie lautet Ihr vollständiger Name?"
full_name = gets.chomp
name = full_name.split (/ \.? \ s + /, 3)
setzt "Ihr Vorname ist # name.first"
setzt "Ihre mittlere Initiale ist # name [1]"
setzt "Ihr Nachname ist # name.last"

Wenn wir dies erneut ausführen und einen niederländischen Namen vergeben, verhält es sich wie erwartet.

$ ruby ​​split.rb
Wie lautet Dein voller Name? Vincent Willem van Gogh
Ihr Vorname ist Vincent
Ihre mittlere Initiale ist Willem
Ihr Nachname ist van Gogh

Wenn dieses Argument jedoch negativ ist (eine negative Zahl), ist die Anzahl der Elemente im Ausgabearray nicht begrenzt, und nachfolgende Begrenzer werden als Zeichenfolgen mit der Länge Null am Ende des Arrays angezeigt.

Dies wird in diesem IRB-Snippet demonstriert:

: 001> "dies ist, ein, Test ,,,,". Split (',', -1)
=> ["this", "is", "a", "test", "", "", "", ""]