Kuinka käyttää "Split" -menetelmää rubiinissa

Kuten ehkä jo tiedät, kielet sisään Rubiini ovat mitä tunnetaan ensimmäisen luokan esineitä jotka käyttävät useita menetelmiä kyselyihin ja manipulointiin.

Yksi yksinkertaisimmista merkkijono manipulointi Toiminnot on jakaa merkkijono useisiin alijonoihin. Tämä tehdään esimerkiksi jos sinulla on merkkijono"foo, bar, baz" ja haluat kolme kieltä "foo", "bar" ja "baz". jakaa Jousi-luokan menetelmä voi suorittaa tämän puolestasi.

"Split": n peruskäyttö

Tyypillisin käyttö jakaa menetelmä on jakaa merkkijono yhden merkin tai staattisen merkkijonojen perusteella. Jos jaon ensimmäinen argumentti on merkkijono, kyseisen merkkijonon merkkejä käytetään merkkijonon erottimen erottajana, kun taas pilkuilla erotetussa tiedossa pilkua käytetään tietojen erottamiseen.

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

Lisää joustavuutta säännöllisillä lausekkeilla

On helpompia tapoja rajata jono. Säännöllisen lausekkeen käyttäminen erottimena tekee jakamismenetelmästä paljon joustavamman.

instagram viewer

Otetaan taas esimerkiksi merkkijono "foo, bar, baz". Tila on ensimmäisen pilkun jälkeen, mutta ei toisen jälkeen. Jos merkkijonoa "," käytetään erottimena, "palkin" merkkijonon alussa on edelleen tilaa. Jos käytetään merkkijonoa "," (välilyönnillä pilkun jälkeen), se vastaa vain ensimmäistä pilkkua, koska toisella pilkulla ei ole välilyöntiä sen jälkeen. Se on hyvin rajoittava.

Ratkaisu tähän ongelmaan on käyttää säännöllistä lauseketta erottelija argumenttina merkkijonon sijasta. Säännölliset lausekkeet antavat sinun sovittaa paitsi staattisten merkkijonojen lisäksi myös määrittelemättömän määrän merkkejä ja valinnaisia ​​merkkejä.

Säännöllisten lausekkeiden kirjoittaminen

Kun kirjoitat säännöllisen lausekkeen erottimellesi, ensimmäinen askel on kuvailla sanoin mikä erotin on. Tässä tapauksessa lause "pilkku, jota voi seurata yksi tai useampi välilyönti" on kohtuullinen.

Regexissä on kaksi elementtiä: pilkku ja valinnaiset välilyönnit. Välilyönnit käyttävät * (tähden tai tähdellä) -määrälaitetta, joka tarkoittaa "nollaa tai enemmän". Mikä tahansa tätä edeltävä elementti vastaa nollaa tai enemmän. Esimerkiksi regex /a*/ vastaa yhtä kuin nolla tai enemmän a-merkkejä.

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

Halkeamien lukumäärän rajoittaminen

Kuvittele pilkuilla erotettu arvojono, kuten "10,20,30, tämä on mielivaltainen merkkijono". Tämä muoto on kolme numeroa, jota seuraa kommenttisarake. Tämä kommenttisarake voi sisältää mielivaltaista tekstiä, mukaan lukien pilkuinen teksti. Estää jakaa jakamatta tämän sarakkeen tekstiä, voimme asettaa jaettavien sarakkeiden enimmäismäärän.

Huomautus: Tämä toimii vain, jos mielivaltaisen tekstin sisältävä kommenttijono on taulukon viimeinen sarake.

Rajoittaaksesi halkaisujen määrän, jonka jakamismenetelmä suorittaa, siirtämällä merkkijonon kenttien lukumäärä toisena argumenttina jakamismenetelmälle, kuten tämä:

#! / usr / bin / env ruby
str = "10,20,30, kymmenen, kaksikymmentä ja kolmekymmentä"
lisää str.split (/, * /, 4)
$ ./3.rb
10
20
30
Kymmenen, kaksikymmentä ja kolmekymmentä

Bonus esimerkki!

Entä jos halusit käyttää jakaa saada kaikki tuotteet paitsi ensimmäinen?

Se on todella yksinkertaista:

ensin * lepo = ex.split (/, /)

Rajoitusten tunteminen

Jakamismenetelmällä on joitain melko suuria rajoituksia.

Otetaan esimerkiksi merkkijono '10, 20, "Bob, Eve ja Mallory", 30 '. Tarkoituksena on kaksi numeroa, jota seuraa lainattu merkkijono (joka voi sisältää pilkuja) ja sitten toinen numero. Jako ei voi erottaa tätä merkkijonoa kenttiin oikein.

Jotta tämä voidaan tehdä, merkkijonoskannerin on oltava tilallinen, mikä tarkoittaa, että se muistaa, onko se lainatun merkkijonon sisällä vai ei. Jaettu skanneri ei ole tilallinen, joten se ei voi ratkaista tämän kaltaisia ​​ongelmia.