Kako razdeliti strune v Ruby

click fraud protection

Če uporabnik vnese eno besedo ali številko, bo to treba vnesti razcepiti ali spremenili v seznam nizov ali številk.

Na primer, če program zahteva vaše polno ime, vključno s srednjim začetnikom, bo najprej moral vhod razdeliti na tri ločene strune preden lahko sodeluje z vašim posameznikom, imenom, priimkom in priimkom. To dosežemo z uporabo String # split metoda.

Kako deluje niz # split

V svoji najbolj osnovni obliki je dr. String # split vzame en argument: ločilo polja kot niz. Ta ločnica bo odstranjena iz izhoda in vrne se niz strun, razdeljen na ločilo.

Torej, v naslednjem primeru, če predpostavimo, da uporabnik pravilno vnese svoje ime, bi morali prejeti trije element Niz iz razcepa.

#! / usr / bin / env rubin
natisni "Kako je tvoje polno ime? "
full_name = get.chomp
ime = polno_ime.split ('')
stavi "Vaše ime je # {name.first}"
stavi "Vaš priimek je # {name.last}"

Če zaženemo ta program in vnesemo ime, bomo dobili nekaj pričakovanih rezultatov. Upoštevajte tudi to ime.prvo in ime.last so naključja. The

instagram viewer
ime spremenljivka bo an Nizin ti dve klicni metodi bosta enakovredni ime [0] in ime [-1] oz.

$ rubin split.rb
Kaj je vaše polno ime? Michael C. Morin
Vaše ime je Michael
Vaš priimek je Morin

Vendar pa je dr. String # split je malo pametnejši, kot bi si mislili. Če je argument za String # split je niz, to dejansko uporablja kot ločilo, če pa je argument niz z enim presledkom (kot smo ga uporabili), potem sklepa, da želite razdeliti poljubno količino praznega prostora in da želite odstraniti tudi vsak vodilni prostor.

Torej, če bi mu dali nekaj rahlo nepravilnega vnosa, kot je

Michael C. Morin

(z dodatnimi presledki), torej String # split bi še vedno naredil, kar se pričakuje. Vendar je to edini poseben primer, ko opravite prehod Vrvica kot prvi argument. Omejevalniki redne ekspresije

Kot prvi argument lahko prenesete tudi navaden izraz. Tukaj, String # split postane nekoliko bolj prilagodljiv. Tudi kodo za delitev majhnih imen lahko naredimo nekoliko pametnejšo.

Ne želimo obdobja na koncu srednjega začetka. Vemo, da gre za srednjo začetnico in baza podatkov tam ne bo želela obdobja, zato jo lahko odstranimo, ko se razdelimo. Kdaj String # split se ujema z običajnim izrazom, naredi enako natančno, kot če bi se pravkar ujemal z ločilnikom niza: vzame ga iz izhoda in ga na tej točki razdeli.

Torej, naš primer lahko nekoliko razvijemo:

$ cat split.rb
#! / usr / bin / env rubin
natisni "Kako je tvoje polno ime? "
full_name = get.chomp
ime = polno_ime.split (/ \.? \ s + /)
stavi "Vaše ime je # {name.first}"
postavi "Vaš srednji začetnik je # {name [1]}"
stavi "Vaš priimek je # {name.last}"

Privzeti ločevalnik zapisov

Ruby res ni veliko pri "posebnih spremenljivkah", ki jih lahko najdete v jezikih, kot je Perl, vendar String # split uporablja enega, ki se ga morate zavedati. To je privzeta spremenljivka ločevalnika zapisov, znana tudi kot $;.

To je nekaj globalnega, česar v Rubyju pogosto ne vidite, tako da, če ga spremenite, lahko vpliva na druge dele kode - le končajte, ko ga dokončate.

Vendar pa vse to spremenljivka deluje kot privzeta vrednost za prvi argument String # split. Zdi se, da je ta spremenljivka privzeto nastavljena na nič. Če pa String # splitPrvi argument je nič, jo bo nadomestil z enim presledkom.

Ločila z dolžino dolžine

Če je ločnica prešla na String # split je niz z nizko dolžino ali pravilni izraz, torej String # split bo deloval nekoliko drugače. To ne bo odstranilo nič iz prvotnega niza in razdeli na vsak znak. To v bistvu pretvori niz v matriko enake dolžine, ki vsebuje samo en-znakovne nize, po enega za vsak znak v nizu.

To je lahko koristno za ponovitev niza in je bilo uporabljeno v pre -9.9.x in pre-1.8.7 (ki podpirajo število funkcij od 1.9.x) do ponovitve znakov v nizu, brez skrbi, da bi razšli večbajt Unicode znaki. Če pa resnično želite narediti ponovitev vrvice in uporabljate 1.8.7 ali 1.9.x, bi verjetno morali uporabiti Niz # vsak_čr namesto tega.

#! / usr / bin / env rubin
str = "Spremenila me je v newt!"
str.split (''). vsak do | c |
postavlja c
konec

Omejevanje dolžine vrnjenega niza

Nazaj na primer razčlenjevanja imena, kaj pa, če ima nekdo presledek v svojem priimku? Na primer, nizozemski priimki se pogosto lahko začnejo z "kombi" (kar pomeni "od" ali "od").

Resnično želimo le 3-element matrika, zato lahko uporabimo drugi argument String # split ki smo jih doslej ignorirali. Drugi argument naj bi bil a Fixnum. Če je ta argument kvečjemu pozitiven, bo v matriki napolnjeno veliko elementov. Torej bi v našem primeru želeli prenesti 3 za ta argument.

#! / usr / bin / env rubin
natisni "Kako je tvoje polno ime? "
full_name = get.chomp
ime = polno ime.split (/ \.? \ s + /, 3)
stavi "Vaše ime je # {name.first}"
postavi "Vaš srednji začetnik je # {name [1]}"
stavi "Vaš priimek je # {name.last}"

Če to ponovno pokrenemo in mu damo nizozemsko ime, bo delovalo po pričakovanjih.

$ rubin split.rb
Kaj je vaše polno ime? Vincent Willem van Gogh
Vaše ime je Vincent
Vaš srednji začetnik je Willem
Vaš priimek je Van Gogh

Če pa je ta argument negativen (poljubno negativno število), ne bo nobene omejitve za število elementi v izhodnem nizu in vsi ločni zaznamki bodo na koncu polja prikazani kot nizi dolžine matrika.

To je prikazano v tem odseku IRB:

: 001> "to, je, test" .split (',', -1)
=> ["ta", "je", "a", "test", "", "", "", ""
instagram story viewer