Som du måske allerede ved, strenger ind Rubin er hvad der er kendt som førsteklasses objekter der bruger en række metoder til forespørgsler og manipulation.
En af de mest basale strengmanipulation handlinger er at opdele en streng i flere understrenge. Dette gøres f.eks. Hvis du har en streng som"foo, bar, baz" og du vil have de tre strenge "foo", "bar" og "baz". Det dele metode til strengklassen kan udføre dette for dig.
Den grundlæggende anvendelse af "Split"
Den mest basale brug af dele metoden er at opdele en streng baseret på et enkelt tegn eller en statisk sekvens af tegn. Hvis split's første argument er en streng, bruges tegnene i den streng som en strengseparator-afgrænser, mens komma i afgrænsede data bruges til at adskille data.
#! / usr / bin / env ruby
str = "foo, bar, baz"
sætter str.split (",")
$ ./1.rb
foo
bar
baz
Tilføj fleksibilitet med regelmæssige udtryk
Der er lettere måder at afgrænse snor. Brug af et regelmæssigt udtryk som din afgrænser gør splitmetoden meget mere fleksibel.
Tag igen for eksempel strengen "foo, bar, baz". Der er et mellemrum efter den første komma, men ikke efter den anden. Hvis strengen "," bruges som en afgrænser, vil der stadig være et rum i begyndelsen af "bar" -strengen. Hvis strengen "," bruges (med et mellemrum efter kommaet), vil det kun matche det første komma, da det andet komma ikke har et mellemrum efter det. Det er meget begrænsende.
Løsningen på dette problem er at bruge et regelmæssigt udtryk som dit afgrænserargument i stedet for en streng. Regelmæssige udtryk giver dig mulighed for at matche ikke kun statiske sekvenser af tegn, men også ubestemte antal tegn og valgfri tegn.
Skrivning af regelmæssige udtryk
Når du skriver et regelmæssigt udtryk til din afgrænser, er det første trin at beskrive med ord, hvad afgrænseren er. I dette tilfælde er udtrykket "et komma, der kan efterfølges af et eller flere mellemrum," rimeligt.
Der er to elementer i denne regex: komma og valgfri mellemrum. Pladserne bruger * (stjerne eller stjerne) kvantificer, hvilket betyder "nul eller mere." Ethvert element, der går foran dette, vil matche nul eller flere gange. For eksempel regex /a*/ vil matche en sekvens på nul eller flere 'a' tegn.
#! / usr / bin / env ruby
str = "foo, bar, baz"
sætter str.split (/, * /)
$ ./2.rb
foo
bar
baz
Begrænsning af antallet af opdelinger
Forestil dig en komma-adskilt værdi streng som "10,20,30, dette er en vilkårlig streng". Dette format er tre numre efterfulgt af en kommentarsøjle. Denne kommentarsøjle kan indeholde vilkårlig tekst, inklusive tekst med kommaer i den. At forhindre dele fra at opdele teksten i denne kolonne, kan vi indstille et maksimalt antal kolonner, der skal opdeles.
Bemærk: Dette fungerer kun, hvis kommentarstrengen med den vilkårlige tekst er den sidste kolonne i tabellen.
For at begrænse antallet af opdelinger, som splitmetoden udfører, skal du videregive antallet af felter i strengen som et andet argument til splitmetoden på denne måde:
#! / usr / bin / env ruby
str = "10,20,30, ti, tyve og tredive"
sætter str.split (/, * /, 4)
$ ./3.rb
10
20
30
Ti, tyve og tredive
Bonuseksempel!
Hvad hvis du ville bruge dele at få alle varerne, men den allerførste?
Det er faktisk meget enkelt:
først * hvile = ex.split (/, /)
At kende begrænsningerne
Opdelingsmetoden har nogle ret store begrænsninger.
Tag f.eks. Strengen '10, 20, 'Bob, Eve and Mallory', 30 '. Hvad der er beregnet til er to numre, efterfulgt af en citeret streng (der kan indeholde kommaer) og derefter et andet nummer. Opdelingen kan ikke opdele denne streng korrekt i felter.
For at gøre dette skal strengsscanneren være det stateful, hvilket betyder, at det kan huske, om det er inde i en citeret streng eller ej. Den delte scanner er ikke statlig, så den kan ikke løse problemer som denne.