Ako používať metódu "Split" v Ruby

Ako už možno viete, vťahuje sa rubín sú známe ako prvotriedne objekty ktoré používajú množstvo metód na dotazy a manipuláciu.

Jeden z najzákladnejších manipulácia s reťazcami Akcie majú rozdeliť reťazec do viacerých čiastkových reťazcov. To by sa dosiahlo napríklad, ak máte reťazec, ako je"foo, bar, baz" a chcete tri reťazce „foo“, „bar“ a „baz“. rozdeliť metóda triedy String to môže dosiahnuť za vás.

Základné použitie výrazu „Split“

Najzákladnejšie využitie systému rozdeliť metóda je rozdeliť reťazec na základe jedného znaku alebo statickej postupnosti znakov. Ak je prvý argument rozdelenia reťazec, znaky v tomto reťazci sa používajú ako oddeľovač reťazcov, zatiaľ čo v údajoch oddelených čiarkami sa čiarka používa na oddelenie údajov.

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

Pridajte flexibilitu pomocou regulárnych výrazov

Existujú jednoduchšie spôsoby, ako vymedziť povrázok. Použitím regulárneho výrazu ako oddeľovača je metóda rozdelenia oveľa flexibilnejšia.

instagram viewer

Znova vezmite napríklad reťazec "foo, bar, baz". Za prvou čiarkou je medzera, ale nie druhá. Ak sa ako oddeľovač použije reťazec „,“, na začiatku reťazca „bar“ bude stále existovať medzera. Ak sa použije reťazec „,“ (s medzerou za čiarkou), bude sa zhodovať iba s prvou čiarkou, pretože druhá čiarka za ňou nemá medzeru. Je to veľmi limitujúce.

Riešením tohto problému je použitie regulárneho výrazu ako argumentu oddeľovača namiesto reťazca. Regulárne výrazy vám umožňujú porovnávať nielen statické postupnosti znakov, ale aj neurčitý počet znakov a voliteľné znaky.

Písanie regulárnych výrazov

Pri písaní regulárneho výrazu pre váš oddeľovač je prvým krokom slovne popísať, čo je oddeľovač. V tomto prípade je fráza „čiarka, za ktorou môže nasledovať jeden alebo viac medzier“ rozumná.

Regex má dva prvky: čiarku a voliteľné medzery. Medzery použijú kvantifikátor * (hviezdička alebo hviezdička), čo znamená „nula alebo viac“. Každý prvok, ktorý tomu predchádza, sa bude zhodovať nula alebo viackrát. Napríklad regex /a*/ bude zodpovedať sekvencii nulových alebo viacerých znakov „a“.

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

Obmedzenie počtu rozdelení

Predstavte si reťazec hodnôt oddelený čiarkami, ako napríklad „10,20,30, toto je ľubovoľný reťazec“. Tento formát tvoria tri čísla, za ktorými nasleduje stĺpec s komentármi. Tento stĺpec s komentármi môže obsahovať ľubovoľný text vrátane textu s čiarkami. Zabrániť rozdeliť od rozdelenia textu tohto stĺpca môžeme nastaviť rozdelenie maximálneho počtu stĺpcov.

Poznámka: Toto bude fungovať iba v prípade, že reťazec komentárov s ľubovoľným textom je posledným stĺpcom tabuľky.

Ak chcete obmedziť počet rozdelení, ktoré vykoná metóda rozdelenia, odovzdajte počet polí v reťazci ako druhý argument metóde rozdelenia, napríklad:

#! / usr / bin / env ruby
str = "10,20,30, desať, dvadsať a tridsať"
kladie str.split (/, * /, 4)
$ ./3.rb
10
20
30
Desať, dvadsať a tridsať

Príklad bonusu!

Čo keby ste chceli použiť rozdeliť dostať všetky položky okrem toho prvého?

Je to vlastne veľmi jednoduché:

najprv * rest = ex.split (/, /)

Poznať obmedzenia

Metóda rozdelenia má niektoré pomerne veľké obmedzenia.

Vezmite napríklad reťazec 10, 20, „Bob, Eva a Mallory“, 30 '. Zamýšľané sú dve čísla, za ktorými nasleduje citovaný reťazec (ktorý môže obsahovať čiarky) a potom ďalšie číslo. Rozdelenie nedokáže tento reťazec správne rozdeliť na polia.

Aby to bolo možné urobiť, musí byť skener reťazcov stavové, čo znamená, že si pamätá, či je vo vnútri citovaného reťazca alebo nie. Rozdelený skener nie je stavový, takže nemôže vyriešiť problémy, ako je tento.