Zoals u misschien al weet, zijn tekenreeksen in Ruby bekend als eersteklas objecten die een aantal methoden gebruiken voor query's en manipulatie.
Een van de meest eenvoudige acties voor het manipuleren van tekenreeksen is het splitsen van een tekenreeks in meerdere subreeksen. Dit zou bijvoorbeeld worden gedaan als u een string als hebt"foo, bar, baz" en je wilt de drie snaren "foo", "bar" en "baz". De spleet methode van de klasse String kan dit voor u bereiken.
Het meest elementaire gebruik van de spleet methode is om een string te splitsen op basis van een enkel karakter of een statische reeks karakters. Als het eerste argument van split een string is, worden de tekens in die string gebruikt als scheidingsteken voor scheidingstekens, terwijl in komma's gescheiden gegevens worden gebruikt om gegevens te scheiden.
#! / usr / bin / env ruby
str = "foo, bar, baz"
zet str.split (",")
$ ./1.rb
foo
bar
baz
Er zijn eenvoudiger manieren om de tekenreeks af te bakenen. Als u een reguliere expressie gebruikt als scheidingsteken, wordt de splitmethode een stuk flexibeler.
Nogmaals, neem bijvoorbeeld de string "foo, bar, baz". Er is een spatie na de eerste komma, maar niet na de tweede. Als de tekenreeks "," wordt gebruikt als scheidingsteken, bestaat er nog steeds een spatie aan het begin van de tekenreeks "bar". Als de tekenreeks ',' wordt gebruikt (met een spatie achter de komma), komt deze alleen overeen met de eerste komma, omdat de tweede komma er geen spatie achter heeft. Het is erg beperkend.
De oplossing voor dit probleem is om een reguliere expressie als scheidingsteken te gebruiken in plaats van een string. Met reguliere expressies kunt u niet alleen statische reeksen tekens matchen, maar ook een onbepaald aantal tekens en optionele tekens.
Wanneer u een reguliere expressie voor uw scheidingsteken schrijft, is de eerste stap om in woorden te beschrijven wat het scheidingsteken is. In dit geval is de uitdrukking "een komma die kan worden gevolgd door een of meer spaties" redelijk.
Deze regex bevat twee elementen: de komma en de optionele spaties. De spaties gebruiken de kwantificeerder * (ster of sterretje), wat "nul of meer" betekent. Elk element dat hieraan voorafgaat, komt nul of meer keer overeen. Bijvoorbeeld de regex /een*/ komt overeen met een reeks van nul of meer 'a'-tekens.
#! / usr / bin / env ruby
str = "foo, bar, baz"
zet str.split (/, * /)
$ ./2.rb
foo
bar
baz
Stel je een door komma's gescheiden waardetekenreeks voor als "10,20,30, dit is een willekeurige string". Dit formaat bestaat uit drie cijfers gevolgd door een commentaarkolom. Deze kolom met opmerkingen kan willekeurige tekst bevatten, inclusief tekst met komma's. Voorkomen spleet door de tekst van deze kolom te splitsen, kunnen we een maximum aantal te splitsen kolommen instellen.
Notitie: Dit werkt alleen als de commentaarreeks met de willekeurige tekst de laatste kolom van de tabel is.
Om het aantal splitsingen te beperken dat de splitmethode zal uitvoeren, geeft u het aantal velden in de string als een tweede argument door aan de splitmethode, als volgt:
#! / usr / bin / env ruby
str = "10,20,30, tien, twintig en dertig"
zet str.split (/, * /, 4)
$ ./3.rb
10
20
30
Tien, twintig en dertig
Wat als je wilde gebruiken spleet om alle items te krijgen behalve de allereerste?
Het is eigenlijk heel simpel:
eerst, * rest = ex.split (/, /)
De splitmethode heeft een aantal vrij grote beperkingen.
Neem bijvoorbeeld de string '10, 20, "Bob, Eve and Mallory", 30 '. Wat bedoeld wordt, zijn twee nummers, gevolgd door een aanhalingsteken (die komma's kan bevatten) en vervolgens een ander nummer. Split kan deze tekenreeks niet correct in velden scheiden.
Om dit te doen, moet de string-scanner zijn stateful, wat betekent dat het kan onthouden of het binnen een aanhalingsteken staat of niet. De gesplitste scanner is niet stateful, dus het kan problemen zoals deze niet oplossen.