Jak používat metodu "Split" v Ruby

click fraud protection

Jak už možná víte, struny v Rubín jsou známé jako prvotřídní objekty které používají řadu metod pro dotazy a manipulaci.

Jeden z nejzákladnějších manipulace s řetězci Akce je rozdělit řetězec na více dílčích řetězců. To by se například stalo, kdybyste měli řetězec jako"foo, bar, baz" a chcete tři řetězce „foo“, „bar“ a „baz“. rozdělit metoda třídy String to může udělat za vás.

Základní použití "Split"

Nejzákladnější využití rozdělit metoda je rozdělit řetězec na základě jednoho znaku nebo statické posloupnosti znaků. Pokud je prvním argumentem split řetězec, znaky v tomto řetězci se používají jako oddělovač řetězců, zatímco v datech oddělených čárkami se čárka používá k oddělení dat.

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

Přidejte flexibilitu pomocí regulárních výrazů

Existují jednodušší způsoby, jak vymezit tětiva. Použitím regulárního výrazu jako oddělovače je metoda rozdělení mnohem flexibilnější.

Znovu vezměte například řetězec "foo, bar, baz"

instagram viewer
. Za první čárkou je mezera, ale ne za druhou. Pokud je řetězec „,“ použit jako oddělovač, bude na začátku řetězce „bar“ stále mezera. Pokud je použit řetězec „,“ (s mezerou za čárkou), bude odpovídat pouze první čárce, protože druhá čárka za ní nemá mezeru. Je to velmi omezující.

Řešením tohoto problému je použití regulárního výrazu jako argumentu oddělovače místo řetězce. Regulární výrazy umožňují porovnávat nejen statické posloupnosti znaků, ale také neurčité počty znaků a volitelných znaků.

Psaní regulárních výrazů

Při psaní regulárního výrazu pro váš oddělovač je prvním krokem slovem popsat, co je oddělovač. V tomto případě je fráze „čárka, za kterou může následovat jeden nebo více mezer“ rozumná.

Tento regex má dva prvky: čárku a volitelné mezery. Mezery budou používat kvantifikátor * (hvězdička nebo hvězdička), což znamená „nula nebo více“. Jakýkoli prvek, který tomu předchází, bude odpovídat nule nebo vícekrát. Například regex /a*/ bude odpovídat posloupnosti nula nebo více 'a' znaků.

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

Omezení počtu rozdělení

Představte si řetězec hodnot oddělený čárkami, například "10,20,30, toto je libovolný řetězec". Tento formát jsou tři čísla následovaná sloupcem komentáře. Tento sloupec komentáře může obsahovat libovolný text, včetně textu s čárkami. Aby se zabránilo rozdělit od rozdělení textu tohoto sloupce můžeme nastavit maximální počet sloupců na rozdělení.

Poznámka: To bude fungovat pouze v případě, že řetězec komentářů s libovolným textem je posledním sloupcem tabulky.

Chcete-li omezit počet rozdělení, které bude metoda split provádět, předejte počet polí v řetězci jako druhý argument metodě rozdělení, například:

#! / usr / bin / env ruby
str = "10,20,30, deset, dvacet a třicet"
klade str.split (/, * /, 4)
$ ./3.rb
10
20
30
Deset, dvacet a třicet

Příklad bonusu!

Co kdybyste chtěli použít rozdělit dostat všechny položky, ale úplně první?

Je to vlastně velmi jednoduché:

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

Znalost omezení

Metoda rozdělení má některá poměrně velká omezení.

Vezměme si například řetězec '10, 20, "Bob, Eva a Mallory", 30 '. Účelem jsou dvě čísla, za nimiž následuje citovaný řetězec (který může obsahovat čárky) a další číslo. Rozdělení nemůže správně oddělit tento řetězec do polí.

Za tímto účelem musí být řetězcový skener stavový, což znamená, že si pamatuje, zda je uvnitř citovaného řetězce nebo ne. Rozdělený skener není stavový, takže nemůže řešit podobné problémy.

instagram story viewer