Använd Split -metoden

Som du kanske redan vet är strängar i Ruby vad som kallas förstklassiga objekt som använder ett antal metoder för frågor och manipulation.

En av de mest grundläggande stränghanteringsåtgärderna är att dela en sträng i flera understrängar. Detta kan till exempel göras om du har en sträng som"foo, bar, baz" och du vill ha de tre strängarna "foo", "bar" och "baz". De dela metod i String klass kan göra detta åt dig.

Den grundläggande användningen av "split"

Den mest grundläggande användningen av dela metod är att dela en sträng baserad på ett enda tecken eller en statisk teckenföljd. Om splitts första argument är en sträng, används tecknen i den strängen som strängavskiljningsavgränsare, medan i kommas avgränsade data används komma för att separera data.

#! / usr / bin / env ruby
str = "foo, bar, baz"
sätter str.split (",")
$ ./1.rb
foo
bar
baz

Lägg till flexibilitet med regelbundna uttryck

Det finns enklare sätt att avgränsa strängen. Att använda ett vanligt uttryck som din avgränsare gör splitmetoden mycket mer flexibel.

Återigen tar du till exempel strängen "foo, bar, baz". Det finns ett utrymme efter den första komma, men inte efter den andra. Om strängen "," används som en avgränsare kommer det fortfarande att finnas ett utrymme i början av "bar" -strängen. Om strängen "," används (med ett mellanslag efter komma) kommer det bara att matcha det första komma eftersom det andra komma inte har ett utrymme efter det. Det är väldigt begränsande.

Lösningen på detta problem är att använda ett vanligt uttryck som ditt avgränsarargument istället för en sträng. Regelbundna uttryck låter dig matcha inte bara statiska teckensekvenser utan också bestämma antal tecken och valfria tecken.

Skriva vanliga uttryck

När du skriver ett regelbundet uttryck för din avgränsare är det första steget att beskriva med ord vad avgränsaren är. I detta fall är frasen "ett komma som kan följas av ett eller flera utrymmen" rimligt.

Det finns två element i denna regex: komma och valfria utrymmen. Utrymmena kommer att använda kvantifieraren * (stjärna eller asterisk), vilket betyder "noll eller mer." Alla element som föregår detta matchar noll eller flera gånger. Till exempel regexen / A * / kommer att matcha en sekvens med noll eller fler "a" -tecken.

#! / usr / bin / env ruby
str = "foo, bar, baz"
sätter str.split (/, * /)
$ ./2.rb
foo
bar
baz

Begränsa antalet delningar

Föreställ dig en kommaseparerad värdesträng som "10,20,30, detta är en godtycklig sträng". Detta format är tre siffror följt av en kommentar kolumn. Den här kommentarkolumnen kan innehålla godtycklig text, inklusive text med kommatecken i den. Att förebygga dela från att dela upp texten i denna kolumn kan vi ställa in ett maximalt antal kolumner som ska delas.

Notera: Detta fungerar bara om kommentarsträngen med godtycklig text är den sista kolumnen i tabellen.

För att begränsa antalet uppdelningar som delningsmetoden kommer att utföra, skickar du antalet fält i strängen som ett andra argument till delningsmetoden, så här:

#! / usr / bin / env ruby
str = "10,20,30, tio, tjugo och trettio"
sätter str.split (/, * /, 4)
$ ./3.rb
10
20
30
Tio, tjugo och trettio

Bonusexempel!

Tänk om du ville använda dela att få alla artiklarna men det allra första?

Det är faktiskt väldigt enkelt:

först * vila = ex.split (/, /)

Att känna till begränsningarna

Delningsmetoden har några ganska stora begränsningar.

Ta till exempel strängen '10, 20, "Bob, Eve och Mallory", 30 '. Det som är avsett är två nummer, följt av en citerad sträng (som kan innehålla komma) och sedan ett annat nummer. Delning kan inte separera den här strängen korrekt i fält.

För att göra detta måste strängskannern vara stateful, vilket betyder att den kan komma ihåg om den är inuti en citerad sträng eller inte. Den delade skannern är inte tillräcklig, så den kan inte lösa problem som den här.