Wie Sie vielleicht bereits wissen, sind Strings in Ruby sogenannte erstklassige Objekte, die eine Reihe von Methoden für Abfragen und Manipulationen verwenden.
Eine der grundlegendsten Aktionen zur Manipulation von Zeichenfolgen besteht darin, eine Zeichenfolge in mehrere Teilzeichenfolgen aufzuteilen. Dies würde zum Beispiel gemacht, wenn Sie eine Zeichenfolge wie haben"foo, bar, baz" und du willst die drei Saiten "foo", "bar" und "baz". Das Teilt Die Methode der String-Klasse kann dies für Sie erledigen.
Die grundlegendste Verwendung der Teilt Bei dieser Methode wird eine Zeichenfolge basierend auf einem einzelnen Zeichen oder einer statischen Zeichenfolge aufgeteilt. Wenn das erste Argument von split eine Zeichenfolge ist, werden die Zeichen in dieser Zeichenfolge als Trennzeichen für Zeichenfolgen verwendet, wohingegen in durch Kommas getrennten Daten das Komma zum Trennen von Daten verwendet wird.
#! / usr / bin / env ruby
str = "foo, bar, baz"
setzt str.split (",")
$ ./1.rb
foo
Bar
baz
Es gibt einfachere Möglichkeiten, die Zeichenfolge abzugrenzen. Durch die Verwendung eines regulären Ausdrucks als Trennzeichen wird die Aufteilungsmethode wesentlich flexibler.
Nehmen Sie wieder zum Beispiel die Zeichenfolge "foo, bar, baz". Nach dem ersten Komma steht ein Leerzeichen, nach dem zweiten jedoch nicht. Wenn die Zeichenfolge "," als Trennzeichen verwendet wird, ist am Anfang der Zeichenfolge "bar" noch ein Leerzeichen vorhanden. Wenn die Zeichenfolge "," verwendet wird (mit einem Leerzeichen nach dem Komma), stimmt sie nur mit dem ersten Komma überein, da das zweite Komma kein Leerzeichen nach dem Komma enthält. Es ist sehr einschränkend.
Die Lösung für dieses Problem besteht darin, anstelle einer Zeichenfolge einen regulären Ausdruck als Trennzeichenargument zu verwenden. Mit regulären Ausdrücken können Sie nicht nur statische Zeichenfolgen abgleichen, sondern auch unbestimmte Anzahl von Zeichen und optionale Zeichen.
Wenn Sie einen regulären Ausdruck für Ihr Trennzeichen schreiben, müssen Sie zunächst in Worten beschreiben, was das Trennzeichen ist. In diesem Fall ist der Ausdruck "ein Komma, dem ein oder mehrere Leerzeichen folgen können" sinnvoll.
Dieser reguläre Ausdruck besteht aus zwei Elementen: dem Komma und den optionalen Leerzeichen. In den Leerzeichen wird der Quantifizierer * (Stern oder Sternchen) verwendet, der "null oder mehr" bedeutet. Jedes Element, das davor steht, stimmt null oder mehrmals überein. Zum Beispiel die Regex /ein*/ stimmen mit einer Folge von null oder mehr 'a' Zeichen überein.
#! / usr / bin / env ruby
str = "foo, bar, baz"
setzt str.split (/, * /)
$ ./2.rb
foo
Bar
baz
Stellen Sie sich eine durch Kommas getrennte Zeichenfolge vor, z "10,20,30, Dies ist eine beliebige Zeichenfolge". Dieses Format besteht aus drei Zahlen, gefolgt von einer Kommentarspalte. Diese Kommentarspalte kann beliebigen Text enthalten, einschließlich Text mit Kommas. Verhindern Teilt Durch Teilen des Texts dieser Spalte können wir die maximale Anzahl der zu teilenden Spalten festlegen.
Hinweis: Dies funktioniert nur, wenn die Kommentarzeichenfolge mit dem beliebigen Text die letzte Spalte der Tabelle ist.
Übergeben Sie die Anzahl der Felder in der Zeichenfolge als zweites Argument an die Aufteilungsmethode, um die Anzahl der Aufteilungen zu begrenzen, die die Aufteilungsmethode ausführt:
#! / usr / bin / env ruby
str = "10,20,30, 10, 20 und 30"
setzt str.split (/, * /, 4)
$ ./3.rb
10
20
30
Zehn, zwanzig und dreißig
Was ist, wenn Sie verwenden wollten Teilt um alle Gegenstände außer dem allerersten zu bekommen?
Es ist eigentlich sehr einfach:
zuerst * rest = ex.split (/, /)
Die Aufteilungsmethode weist einige ziemlich große Einschränkungen auf.
Nehmen Sie zum Beispiel die Zeichenfolge '10, 20, "Bob, Eve and Mallory", 30 '. Es sind zwei Zahlen vorgesehen, gefolgt von einer Zeichenfolge in Anführungszeichen (die Kommas enthalten kann) und einer weiteren Zahl. Split kann diese Zeichenfolge nicht korrekt in Felder unterteilen.
Dazu muss der Stringscanner sein Staatsbürgerlich, Dies bedeutet, dass es sich merken kann, ob es sich um eine Zeichenfolge in Anführungszeichen handelt oder nicht. Der geteilte Scanner ist nicht statusbehaftet und kann daher Probleme wie dieses nicht lösen.