Splitting av en streng er bare en måte å manipulere strengdata på. Du kan også gjøre substitusjoner for å erstatte en del av en streng med en annen streng. For eksempel i et eksempelstreng (foo, bar, baz) som erstatter "foo" med "boo" i ville gi "boo, bar, baz." Du kan gjøre dette og mange flere ting ved å bruke under og gsub metode i strengklassen.
Mange alternativer for rubinsubstitusjon
Substitusjonsmetodene kommer i to varianter. De under metoden er den mest grunnleggende av de to og kommer med minst mulig overraskelser. Den erstatter bare den første forekomsten av det angitte mønsteret med erstatningen.
mens under erstatter bare den første forekomsten, the gsub metoden erstatter alle forekomster av mønsteret med utskiftningen. I tillegg begge deler under og gsub ha under! og gsub! kolleger. Husk metoder i Rubin som ender i et utropstegn endrer variabelen på plass i stedet for å returnere en modifisert kopi.
Søk og erstatt
Den mest grunnleggende bruken av substitusjonsmetodene er å erstatte en statisk søkestring med en statisk erstatningsstreng. I eksemplet ovenfor ble "foo" erstattet med "boo." Dette kan gjøres for den første forekomsten av "foo" i strengen ved å bruke
under metode eller med alle forekomster av "foo" ved bruk av gsub metode.#! / usr / bin / env ruby
a = "foo, bar, baz"
b = a.sub ("foo", "boo")
setter b
$ ./1.rb
foo, bar, baz
gsub $ ./1.rb
boo, bar, baz
Fleksibel søk
Å søke etter statiske strenger kan bare gå så langt. Etter hvert vil du få et tilfelle hvor en undergruppe av strenger eller strengene med valgfrie komponenter må samsvares. Substitusjonsmetodene kan selvfølgelig stemme med vanlige uttrykk i stedet for statiske strenger. Dette gjør at de kan være mye mer fleksible og matche praktisk talt alle tekster du kan drømme opp.
Dette eksemplet er en litt mer ekte verden. Se for deg et sett med komma-separerte verdier. Disse verdiene mates inn i et tabuleringsprogram som du ikke har kontroll over (lukket kilde). Programmet som genererer disse verdiene er også lukket kildekode, men det gir ut noe dårlig formatert data. Noen felt har mellomrom etter komma, og dette fører til at tabulatorprogrammet går i stykker.
En mulig løsning er å skrive et Ruby-program for å fungere som "lim" eller et filter mellom de to programmene. Dette Ruby-programmet vil løse eventuelle problemer i dataformateringen slik at tabulatoren kan gjøre jobben sin. For å gjøre dette er det ganske enkelt: erstatt et komma etterfulgt av et antall mellomrom med bare et komma.
#! / usr / bin / env ruby
STDIN.each do | l |
l.gsub! (/, + /, ",")
setter l
slutt
gsub $ cat data.txt
10, 20, 30
12.8, 10.4,11
gsub $ cat data.txt | ./2.rb
10,20,30
12.8,10.4,11
Fleksible utskiftninger
Forestill deg denne situasjonen. I tillegg til den mindre formateringen feil, programmet som produserer dataene produserer talldata i vitenskapelig notasjon. Tabulatorprogrammet forstår ikke dette, så du må bytte ut det. Det er klart, en enkel gsub vil ikke gjøre her fordi utskiftningen vil være forskjellig hver gang utskiftingen gjøres.
Heldigvis kan substitusjonsmetodene blokkere substitusjonsargumentene. For hver gang søkestrengen blir funnet, blir teksten som matchet søkestrengen (eller regex) ført til denne blokken. Verdien gitt av blokken brukes som substitusjonsstreng. I dette eksemplet et flytende punktnummer i vitenskapelig notasjonsform (som f.eks 1.232e4) konverteres til et normalt tall med desimal. Strengen konverteres til et tall med to_f, så blir tallet formatert ved hjelp av en formatstreng.
#! / usr / bin / env ruby
STDIN.each do | l |
l.gsub! (/-?\d+\.\d+e-?\d+/) do | n |
"% .3f"% n.to_f
slutt
l.gsub! (/, + /, ",")
setter l
slutt
gsub $ cat floatdata.txt
2.215e-1, 54, 11
3.15668e6, 21, 7
gsub $ cat floatdata.txt | ./3.rb
0.222,54,11
3156680.000,21,7
Ikke kjent med vanlige uttrykk?
La oss ta et skritt tilbake og se på det vanlig uttrykk. Det ser kryptisk og komplisert ut, men det er veldig enkelt. Hvis du ikke er kjent med vanlige uttrykk, kan de være ganske kryptiske. Når du først er kjent med dem, er de enkle og naturlige metoder for å beskrive tekst. Det er en rekke elementer, og flere av elementene har kvantifiserere.
Det primære elementet her er \ d karakterklasse. Dette vil samsvare med alle sifre, karakterene 0 til 9. Kvantifisereren + brukes med sifferetegnklassen for å indikere at ett eller flere av disse sifrene skal samsvares på rad. Du har tre grupper med sifre, to atskilt med en "."og den andre atskilt med bokstaven"e"(for eksponent).
Det andre elementet som flyter rundt er minus-tegnet, som bruker "?"kvantifiserer. Dette betyr "null eller en" av disse elementene. Så kort sagt, det kan være eller ikke være negative tegn på begynnelsen av tallet eller eksponenten.
De to andre elementene er. (periode) karakter og e karakter. Kombiner alt dette, så får du et regelmessig uttrykk (eller sett med regler for samsvarende tekst) som samsvarer med tall i vitenskapelig form (for eksempel 12.34e56).