Ako rozdeliť struny v Ruby

click fraud protection

Pokiaľ užívateľský vstup nie je jediné slovo alebo číslo, musí byť tento vstup rozdeliť alebo sa zmenil na zoznam reťazcov alebo čísel.

Napríklad, ak program požiada o vaše celé meno vrátane stredného iniciála, bude najskôr potrebné tento vstup rozdeliť na tri samostatné reťazce predtým, ako bude môcť pracovať s vaším osobným menom, prostredným menom a priezviskom. Toto sa dosiahne pomocou Reťazec # delené metóda.

Ako funguje String # split

Vo svojej najzákladnejšej podobe Reťazec # delené berie jediný argument: oddeľovač polí ako reťazec. Tento oddeľovač bude odstránený z výstupu a vráti sa pole reťazcov rozdelených na oddeľovači.

Takže v nasledujúcom príklade, za predpokladu, že používateľ zadá správne svoje meno, by ste mali dostať trojprvok rad z rozdelenia.

#! / usr / bin / env ruby
print "Aké je vaše celé meno? "
full_name = gets.chomp
name = full_name.split ('')
vloží „Vaše meno je # {name.first}“
vloží „Vaše priezvisko je # {name.last}“

Ak spustíme tento program a zadáme meno, získame očakávané výsledky. Tiež si všimnite, že

instagram viewer
name.first a name.last sú náhody. názov premenná bude rada tieto dve volania metód budú rovnocenné Názov [0] a name [-1] resp.

$ ruby ​​split.rb
Aké je vaše meno a priezvisko? Michael C. Morin
Vaše meno je Michael
Vaše priezvisko je Morin

Avšak, Reťazec # delené je trochu múdrejší, než si myslíte. Ak argument Reťazec # delené je reťazec, ktorý ho skutočne používa ako oddeľovač, ale ak je argument reťazec s jedným medzerou (ako sme používali), potom z toho vyplynie, že sa chcete rozdeliť na ľubovoľné množstvo medzier a že tiež chcete odstrániť všetky vedúce medzery.

Takže, ak by sme to mali dať nejakým mierne deformovaným vstupom, napríklad

Michael C. Morin

(s medzerami), potom Reťazec # delené stále by robil to, čo sa očakáva. To je však jediný osobitný prípad, keď prejdete okolo povrázok ako prvý argument. Oddeľovače regulárnych výrazov

Ako prvý argument môžete tiež vložiť regulárny výraz. Tu, Reťazec # delené sa stáva o niečo flexibilnejším. Môžeme tiež urobiť trochu inteligentnejší kód na rozdelenie mena.

Nechceme, aby obdobie na konci stredného počiatočného obdobia. Vieme, že je to stredná iniciála a databáza tam nechce obdobie, takže ju môžeme počas rozdelenia odstrániť. Kedy Reťazec # delené sa zhoduje s regulárnym výrazom, robí to isté, ako keby práve zodpovedalo oddeľovaču reťazcov: vytiahne ho z výstupu a v tomto bode ho rozdelí.

Môžeme teda trochu rozvinúť náš príklad:

$ cat split.rb
#! / usr / bin / env ruby
print "Aké je vaše celé meno? "
full_name = gets.chomp
name = full_name.split (/ \.? \ s + /)
vloží „Vaše meno je # {name.first}“
vloží „Vaša stredná iniciála je # {name [1]}“
vloží „Vaše priezvisko je # {name.last}“

Predvolený oddeľovač záznamu

rubín nie je príliš veľká na „špeciálne premenné“, ktoré by ste mohli nájsť v jazykoch ako Perl, ale Reťazec # delené používa ten, o ktorom musíš vedieť. Toto je predvolená premenná oddeľovača záznamu, známa tiež ako $;.

Je to globálny program, ktorý v Ruby často nevidíte, takže ak ho zmeníte, môže to ovplyvniť ďalšie časti kódu - po dokončení ho nezabudnite zmeniť.

Všetky tieto premenné však fungujú ako predvolená hodnota pre prvý argument Reťazec # delené. Zdá sa, že táto premenná je predvolene nastavená na nula. Avšak, ak Reťazec # delenéPrvý argument je nula, nahradí ho jedným reťazcom medzery.

Oddeľovače s nulovou dĺžkou

Ak oddeľovač prešiel na Reťazec # delené je reťazec nulovej dĺžky alebo regulárny výraz Reťazec # delené bude sa správať trochu inak. Z pôvodného reťazca nič neodstráni a rozdelí sa na každú postavu. Toto v podstate premení reťazec na pole rovnakej dĺžky, ktoré obsahuje iba jednoznakové reťazce, jeden pre každý znak v reťazci.

To môže byť užitočné pre opakovanie reťazca a používalo sa v pred-1.9.xa pred-1.8.7 (ktoré spätne počet funkcií od 1.9.x) iterovať znaky v reťazci bez obáv z rozpadu multi-byte Znaky Unicode. Ak však naozaj chcete opakovať reťazec a používate reťazec 1.8.7 alebo 1.9.x, pravdepodobne by ste mali použiť Reťazec # each_char miesto.

#! / usr / bin / env ruby
str = "Obrátila ma na mloka!"
str.split (''). každý robí | c |
kladie c
koniec

Obmedzenie dĺžky vráteného poľa

Takže naspäť k nášmu príkladu na rozbor, čo keď má niekto v priezvisku medzeru? Napríklad holandské priezviská často začínajú „van“ (čo znamená „z“ alebo „od“).

Skutočne chceme iba 3-prvok rad, takže môžeme použiť druhý argument na Reťazec # delené ktoré sme doteraz ignorovali. Očakáva sa, že druhým argumentom bude a Fixnum. Ak je tento argument pozitívny, nanajvýš bude vyplnených veľa prvkov v poli. Takže v našom prípade by sme chceli prejsť 3 za tento argument.

#! / usr / bin / env ruby
print "Aké je vaše celé meno? "
full_name = gets.chomp
name = full_name.split (/ \.? \ s + /, 3)
vloží „Vaše meno je # {name.first}“
vloží „Vaša stredná iniciála je # {name [1]}“
vloží „Vaše priezvisko je # {name.last}“

Ak to znova spustíme a pomôžeme mu holandským menom, bude to fungovať podľa očakávania.

$ ruby ​​split.rb
Aké je vaše meno a priezvisko? Vincent Willem van Gogh
Vaše meno je Vincent
Váš stredný iniciál je Willem
Vaše priezvisko je van Gogh

Ak je však tento argument negatívny (akékoľvek záporné číslo), potom nebude existovať nijaké obmedzenie počtu prvky vo výstupnom poli a všetky koncové oddeľovače sa zobrazia ako reťazce s nulovou dĺžkou na konci array.

Toto je demonštrované v tomto zlomku IRB:

: 001> „toto, je test,“ .plpl (',', -1)
=> ["toto", "je", "a", "test", "", "", "", ""]
instagram story viewer