Computerwissenschaften

So teilen Sie Strings in Ruby

Sofern die Benutzereingabe kein einzelnes Wort oder keine einzelne Zahl ist, 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 zuerst in drei separate Zeichenfolgen aufteilen, bevor es mit Ihrem individuellen Vor-, Mittel- und Nachnamen arbeiten kann. Dies wird mit der String # split- Methode erreicht.

 

So funktioniert String # split

In seiner grundlegendsten Form verwendet String # split ein einziges Argument: das Feldtrennzeichen als String. Dieses Trennzeichen wird aus der Ausgabe entfernt und ein Array von Zeichenfolgen, die auf dem Trennzeichen aufgeteilt sind, wird zurückgegeben.

Wenn Sie im folgenden Beispiel davon ausgehen, dass der Benutzer seinen Namen korrekt eingegeben hat, sollten Sie ein Array mit drei Elementen aus der Aufteilung erhalten.

#! / 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 "Ihren Nachnamen ist # {name.last} "

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

$ ruby ​​split.rb 
Wie lautet Ihr vollständiger Name? Michael C. Morin 
Ihr Vorname ist Michael 
Ihr Nachname ist Morin

Allerdings  String # Split ist ein bisschen schlauer als man denken würde. Wenn das Argument für String # split eine Zeichenfolge ist, wird es zwar als Trennzeichen verwendet. Wenn es sich bei dem Argument jedoch um eine Zeichenfolge mit einem einzelnen Leerzeichen handelt (wie wir es verwendet haben), wird daraus geschlossen, 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), dann würde String # split immer noch das tun, was erwartet wird. Dies ist jedoch der einzige Sonderfall, wenn Sie als erstes Argument einen String übergeben . Trennzeichen für reguläre Ausdrücke

Sie können auch einen regulären Ausdruck als erstes Argument übergeben. Hier wird String # split etwas flexibler. Wir können unseren Code zur Aufteilung kleiner Namen auch etwas intelligenter gestalten.

Wir wollen den Zeitraum am Ende der mittleren Initiale nicht. 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. Wenn String # split mit einem regulären Ausdruck übereinstimmt, geschieht genau das Gleiche, als ob es gerade mit einem String-Trennzeichen übereinstimmen würde: Es wird aus der Ausgabe entfernt und an diesem Punkt aufgeteilt.

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 stark in Bezug auf „spezielle Variablen“, die Sie möglicherweise in Sprachen wie Perl finden, aber String # split verwendet eine, die Sie beachten müssen. Dies ist die Standardvariable für Datensatztrennzeichen, die auch als $ bezeichnet wird. .

Es ist ein globales Element, 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 für String # split . Standardmäßig scheint diese Variable auf Null gesetzt zu sein . Wenn das erste Argument von String # split jedoch Null ist , wird es durch eine einzelne Leerzeichenfolge ersetzt.

 

Trennzeichen mit Nulllänge

Wenn das an String # split übergebene Trennzeichen ein String mit null Länge oder ein regulärer Ausdruck ist, verhält sich String # split etwas anders. 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 die Zeichenfolge zu durchlaufen, und wurde in Version 1.9.x und Version 1.8.7 (die eine Reihe von Funktionen von Version 1.9.x zurückportierten) verwendet, um Zeichen in einer Zeichenfolge zu durchlaufen, ohne sich Gedanken über das Aufbrechen von Mehrfachzeichenfolgen machen zu müssen. Byte Unicode-Zeichen. Wenn Sie jedoch wirklich über eine Zeichenfolge iterieren möchten und 1.8.7 oder 1.9.x verwenden, sollten Sie stattdessen wahrscheinlich die Zeichenfolge # each_char verwenden.

#! / 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 für String # split verwenden , das wir bisher ignoriert haben. Das zweite Argument wird voraussichtlich ein Fixnum sein . 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 Ihr vollständiger 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), ist die Anzahl der Elemente im Ausgabearray unbegrenzt, und nachfolgende Trennzeichen werden am Ende des Arrays als Zeichenfolgen mit der Länge Null angezeigt.

Dies wird in diesem IRB-Snippet demonstriert:

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

Similar Posts

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.