Kao što možda već znate, žice u Rubin su ono što je poznato kao prvoklasni objekti koji koriste brojne metode za upite i manipulaciju.
Jedna od najosnovnijih manipulacija nizom Radnja je podijeliti niz u više podjedinica. To bi se dogodilo, na primjer, ako imate niz poput"foo, bar, baz" i želite tri strune "foo", "bar" i "baz". podjela metoda String klase to može postići za vas.
Osnovna upotreba "Splita"
Najosnovnija uporaba podjela metoda je podijeliti niz na temelju jednog znaka ili statičkog niza znakova. Ako je prvi argument split-a niz, znakovi u tom nizu koriste se kao razdvajač niza niza, dok se u podacima razgraničenim zarezom zarez koristi za odvajanje podataka.
#! / usr / bin / env rubin
str = "foo, bar, baz"
stavlja str.split (",")
$ ./1.rb
foo
bar
baz
Dodajte fleksibilnost regularnim izrazima
Postoje lakši načini za njihovo ograničavanje niz. Korištenje pravilnog izraza kao razgraničenja čini metodu razdvajanja mnogo fleksibilnijom.
Opet uzmimo za primjer string "foo, bar, baz". Nakon prvog zareza postoji razmak, ali ne i nakon drugog. Ako se niz "", koristi kao razdjelnik, na početku niza "bar" i dalje će postojati prostor. Ako se koristi niz "," (s razmakom nakon zareza), on će odgovarati samo prvom zarezu jer drugi zarez nakon njega nema razmaka. Vrlo je ograničavajući.
Rješenje ovog problema je upotreba regularnog izraza kao vašeg razgraničenja, umjesto niza. Redovni izrazi omogućuju vam podudaranje ne samo statičkih nizova znakova, već i neodređenih brojeva znakova i neobaveznih znakova.
Pisanje regularnih izraza
Kada pišete regularni izraz za svoj razgraničitelj, prvi je korak opisati riječima što je razgraničnik. U ovom slučaju, izraz "zarez koji može slijediti jedan ili više razmaka" je razumna.
Dva su elementa ovog regexa: zarez i neobavezni razmaci. U razmacima će se koristiti kvanfikator * (zvjezdica ili zvjezdica), što znači "nula ili više". Bilo koji element koji prethodi tome odgovarat će nula ili više puta. Na primjer, regex /a*/ podudarat će se s nizom nula ili više znakova 'a'.
#! / usr / bin / env rubin
str = "foo, bar, baz"
stavlja str.split (/, * /)
$ ./2.rb
foo
bar
baz
Ograničavanje broja podjela
Zamislite niz znakova odvojen zarezom, kao što su "10,20,30, ovo je proizvoljni niz". Ovaj je format tri broja, a slijedi stupac s komentarima. Ovaj stupac za komentare može sadržavati proizvoljni tekst, uključujući tekst s zarezima u njemu. Spriječiti podjela dijeljenjem teksta ovog stupca možemo postaviti maksimalan broj stupaca za podjelu.
Bilješka: Ovo će raditi samo ako je niz komentara s proizvoljnim tekstom posljednji stupac tablice.
Da biste ograničili broj dijeljenja, split metoda će se izvršiti, proslijedite broj polja u nizu kao drugi argument metodi split, ovako:
#! / usr / bin / env rubin
str = "10,20,30, deset, dvadeset i trideset"
stavlja str.split (/, * /, 4)
$ ./3.rb
10
20
30
Deset, dvadeset i trideset
Primjer bonusa!
Što ako želite koristiti podjela nabaviti sve predmete, ali onaj prvi?
Zapravo je vrlo jednostavno:
prvo, * ostatak = ex.split (/, /)
Poznavajući ograničenja
Metoda razdvajanja ima prilično velika ograničenja.
Uzmimo za primjer string '10, 20, "Bob, Eva i Mallory", 30 '. Namjera je dva broja, nakon čega slijedi citirani niz (koji može sadržavati zareze), a zatim još jedan broj. Split ne može ispravno odvojiti ovaj niz u polja.
Da biste to učinili, skeniranje stringova mora biti stanjem transakcije, što znači da se može sjetiti je li unutar citiranog niza ili ne. Deljeni skener nije izvanredan pa ne može riješiti probleme poput ovog.