Hvordan dele strenger i Ruby

click fraud protection

Med mindre brukerinndata er et enkelt ord eller nummer, vil den inngangen være nødvendig dele eller gjort om til en liste over strenger eller tall.

For eksempel, hvis et program ber om ditt fulle navn, inkludert mellom initial, må det først deles inndata i tre separate strenger før den kan fungere med ditt individuelle for-, mellom- og etternavn. Dette oppnås ved å bruke String # split metode.

Hvordan String # split fungerer

I sin mest grunnleggende form, String # split tar et enkelt argument: feltavgrenseren som en streng. Denne avgrenseren fjernes fra utgangen og en rekke strenger som er delt på avgrenseren, vil bli returnert.

Så i følgende eksempel, hvis du antar at brukeren skriver inn navnet sitt riktig, bør du motta et treelement Array fra splittelsen.

#! / usr / bin / env ruby
print "Hva heter du fullt navn? "
full_name = gets.chomp
name = full_name.split ('')
setter "Fornavnet ditt er # {name.first}"
setter "Etternavnet ditt er # {name.last}"

Hvis vi kjører dette programmet og skriver inn et navn, vil vi få noen forventede resultater. Legg også merke til at

instagram viewer
navn først og etternavn er tilfeldigheter. De Navn variabel vil være en Array, og de to metodeanropene tilsvarer navn [0] og nevne [-1] henholdsvis.

$ ruby ​​split.rb
Hva er ditt fulle navn? Michael C. Morin
Ditt fornavn er Michael
Etternavnet ditt er Morin

Men, String # split er litt smartere enn du skulle tro. Hvis argumentet til String # split er en streng, bruker den den faktisk som avgrenser, men hvis argumentet er en streng med et enkelt mellomrom (som vi brukte), så gir det ut at du vil dele på en hvilken som helst mengde hvitrom og at du også vil fjerne alle ledende hvitområder.

Så hvis vi skulle gi det litt misdannede innspill som f.eks

Michael C. Morin

(med ekstra mellomrom), da String # split vil fremdeles gjøre det som forventes. Imidlertid er det det eneste spesielle tilfellet når du passerer en string som det første argumentet. Vanlige uttrykksavgrensere

Du kan også passere et vanlig uttrykk som det første argumentet. Her, String # split blir litt mer fleksibel. Vi kan også gjøre det lille navnet som deler koden litt smartere.

Vi vil ikke ha perioden på slutten av den midterste initialen. Vi vet at det er en mellominitial, og databasen vil ikke ha en periode der, så vi kan fjerne den mens vi deler oss. Når String # split samsvarer med et vanlig uttrykk, gjør det samme eksakte som om den nettopp hadde matchet en strengavgrenser: den tar den ut av utdataene og deler den på det tidspunktet.

Så vi kan utvikle vårt eksempel litt:

$ katt split.rb
#! / usr / bin / env ruby
print "Hva heter du fullt navn? "
full_name = gets.chomp
name = full_name.split (/ \.? \ s + /)
setter "Fornavnet ditt er # {name.first}"
setter "Den midterste initialen din er # {name [1]}"
setter "Etternavnet ditt er # {name.last}"

Standard Record Separator

Rubin er ikke veldig stor på "spesielle variabler" som du kanskje finner på språk som Perl, men String # split bruker en du trenger å være klar over. Dette er standard oppføringsseparatorvariabel, også kjent som $;.

Det er et globalt, noe du ikke ofte ser i Ruby, så hvis du endrer det, kan det påvirke andre deler av koden - bare husk å endre den tilbake når du er ferdig.

Imidlertid fungerer all denne variabelen som standardverdien for det første argumentet til String # split. Som standard ser det ut til at denne variabelen er satt til nil. Imidlertid hvis String # splitDet første argumentet er nil, vil den erstatte den med en enkelt mellomromstreng.

Null-lengde avgrensere

Hvis avgrenseren gikk til String # split er en streng med null lengder eller vanlig uttrykk, da String # split vil oppføre seg litt annerledes. Den vil slett ikke fjerne noe fra den opprinnelige strengen og dele på hvert tegn. Dette gjør i det vesentlige strengen til en rekke med samme lengde som bare inneholder strenger med ett tegn, en for hvert tegn i strengen.

Dette kan være nyttig for iterering over strengen og ble brukt i pre-1.9.x og pre-1.8.7 (som tilbakeporterte en antall funksjoner fra 1.9.x) for å iterere over tegn i en streng uten å bekymre deg for å bryte opp multi-byte Unicode-tegn. Imidlertid, hvis det du virkelig vil gjøre er å itere over en streng, og du bruker 1.8.7 eller 1.9.x, bør du sannsynligvis bruke String # each_char i stedet.

#! / usr / bin / env ruby
str = "Hun forvandlet meg til en newt!"
str.split (''). hver gjør | c |
setter c
slutt

Begrense lengden på den returnerte arrayen

Så tilbake til eksemplet med analyse av navn, hva om noen har et mellomrom i etternavnet? For eksempel kan nederlandske etternavn ofte begynne med "varebil" (som betyr "av" eller "fra").

Vi ønsker bare et 3-element matrise, slik at vi kan bruke det andre argumentet til String # split som vi så langt har ignorert. Det andre argumentet forventes å være et Fixnum. Hvis dette argumentet er positivt, på det meste, at mange elementer vil bli fylt i matrisen. Så i vårt tilfelle ønsker vi å passere 3 for dette argumentet.

#! / usr / bin / env ruby
print "Hva heter du fullt navn? "
full_name = gets.chomp
name = full_name.split (/ \.? \ s + /, 3)
setter "Fornavnet ditt er # {name.first}"
setter "Den midterste initialen din er # {name [1]}"
setter "Etternavnet ditt er # {name.last}"

Hvis vi kjører dette igjen og gir det et nederlandsk navn, vil det fungere som forventet.

$ ruby ​​split.rb
Hva er ditt fulle navn? Vincent Willem van Gogh
Ditt fornavn er Vincent
Den midterste initialen din er Willem
Etternavnet ditt er van Gogh

Imidlertid, hvis dette argumentet er negativt (et hvilket som helst negativt tall), vil det ikke være noen begrensning på antallet elementer i utgangsoppstillingen og eventuelle etterfølgende avgrensere vil vises som strenger med null lengde på slutten av array.

Dette demonstreres i dette IRB-utdraget:

: 001> "dette, er, en, test" .split (',', -1)
=> ["dette", "er", "en", "test", "", "", "", ""]
instagram story viewer