Sofern die Benutzereingabe kein einzelnes Wort oder keine einzelne Zahl ist, muss diese Eingabe erfolgen Teilt oder in eine Liste von Zeichenfolgen oder Zahlen umgewandelt.
Wenn ein Programm beispielsweise nach Ihrem vollständigen Namen einschließlich der mittleren Initiale fragt, muss es diese Eingabe zunächst in drei separate Teile aufteilen Saiten bevor es mit Ihrem individuellen Vor-, Mittel- und Nachnamen funktionieren kann. Dies wird mit dem erreicht String # split Methode.
So funktioniert String # split
In seiner grundlegendsten Form, String # split nimmt ein einziges Argument: das Feldtrennzeichen als Zeichenfolge. Dieses Trennzeichen wird aus der Ausgabe entfernt und ein Array von Zeichenfolgen, die auf dem Trennzeichen aufgeteilt sind, wird zurückgegeben.
Wenn im folgenden Beispiel der Benutzer seinen Namen korrekt eingibt, sollten Sie ein Drei-Elemente-Element erhalten Array von der Trennung.
#! / 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 entsprechen Name [0] und Name [-1] beziehungsweise.
$ ruby split.rb
Wie lautet Dein voller Name? Michael C. Morin
Dein 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, die zwar als Trennzeichen verwendet wird, aber wenn das Argument eine Zeichenfolge mit einem einzelnen Leerzeichen ist (wie wir es verwendet haben), Daraus folgt, dass Sie eine beliebige Anzahl von Leerzeichen aufteilen möchten und dass Sie auch alle führenden Leerzeichen entfernen möchten.
Also, wenn wir ihm eine leicht missgebildete Eingabe geben würden, wie z
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 a bestehen String als erstes Argument. Trennzeichen 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 Code zur Aufteilung kleiner Namen auch etwas intelligenter gestalten.
Wir wollen nicht den Punkt am Ende der mittleren Initiale. Wir wissen, dass es sich um eine mittlere Initiale handelt, und die Datenbank möchte dort keinen Punkt, sodass wir sie entfernen können, während wir uns teilen. Wann String # split Entspricht ein regulärer Ausdruck, geschieht genau das Gleiche, als ob er gerade mit einem Zeichenfolgenbegrenzer übereinstimmte: Er nimmt ihn aus der Ausgabe heraus und teilt ihn 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
Rubin ist nicht wirklich groß auf "spezielle Variablen", die Sie in Sprachen wie Perl finden könnten, aber String # split verwendet eine, die Sie beachten müssen. Dies ist die Standardvariable für Datensatztrennzeichen, auch bekannt als $;.
Es ist global, etwas, das Sie in Ruby nicht oft sehen. Wenn Sie es also ändern, kann es sich auf andere Teile des Codes auswirken. Ändern Sie es einfach zurück, wenn Sie fertig sind.
Diese Variable fungiert jedoch nur als Standardwert für das erste Argument String # split. Standardmäßig scheint diese Variable auf eingestellt zu sein Null. jedoch, wenn String # splitDas erste Argument ist Nullwird es durch eine einzelne Leerzeichenfolge ersetzt.
Trennzeichen mit Nulllänge
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 ein bisschen anders handeln. 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 Version 1.9.x und Version 1.8.7 (die a zurückportierten) verwendet Anzahl der Funktionen von 1.9.x), um Zeichen in einer Zeichenfolge zu durchlaufen, ohne sich Gedanken über das Aufbrechen machen zu müssen Multi-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 (''). jedes do | c |
setzt c
Ende
Begrenzen der Länge des zurückgegebenen Arrays
Zurück zu unserem Beispiel für die Namensanalyse: Was ist, wenn jemand ein Leerzeichen in seinem Nachnamen hat? Beispielsweise können niederländische Nachnamen häufig mit "van" (was "von" oder "von" bedeutet) beginnen.
Wir wollen wirklich nur ein 3-Element Array, also können wir das zweite Argument verwenden, um String # split das haben wir bisher ignoriert. Das zweite Argument wird voraussichtlich a sein Fixnum. Wenn dieses Argument höchstens positiv ist, werden so viele Elemente in das Array gefüllt. 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 ihm einen niederländischen Namen geben, wird es wie erwartet funktionieren.
$ 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 beliebige negative Zahl), gibt es keine Begrenzung für die Anzahl von Elemente im Ausgabearray und alle nachfolgenden Trennzeichen werden am Ende des als Zeichenfolgen mit der Länge Null angezeigt Array.
Dies wird in diesem IRB-Snippet demonstriert:
: 001> "dies ist ein Test" .split (',', -1)
=> ["dies", "ist", "ein", "Test", "", "", "", ""]