Opdeling af en streng er kun en måde at manipulere strengdata på. Du kan også foretage udskiftninger for at erstatte en del af en streng med en anden streng. For eksempel ville i en eksempelstreng (foo, bar, baz), der erstatter "foo" med "boo" i, give "boo, bar, baz." Du kan gøre dette og mange flere ting ved hjælp af sub og gsub metode i strengklassen.
Mange muligheder for rubinsubstitution
Substitutionsmetoder findes i to sorter. Det sub metoden er den mest basale af de to og leveres med det mindste antal overraskelser. Det erstatter blot den første forekomst af det angivne mønster med udskiftningen.
ud fra følgende betragtninger sub erstatter kun den første instans, the gsub metoden erstatter alle forekomster af mønsteret med udskiftningen. Derudover begge dele sub og gsub har sub! og gsub! modstykker. Husk, metoder i Rubin der ender med et udråbstegn ændre variablen på plads i stedet for at returnere en ændret kopi.
Søg og udskift
Den mest basale anvendelse af substitutionsmetoderne er at erstatte en statisk søgestreng med en statisk erstatningsstreng. I ovenstående eksempel blev "foo" erstattet med "boo." Dette kan gøres ved den første forekomst af "foo" i strengen ved hjælp af
sub metode eller med alle forekomster af "foo" ved hjælp af gsub metode.#! / usr / bin / env ruby
a = "foo, bar, baz"
b = a.sub ("foo", "boo")
sætter b
$ ./1.rb
foo, bar, baz
gsub $ ./1.rb
boo, bar, baz
Fleksibel søgning
Søgning efter statiske strenge kan kun gå så langt. Til sidst vil du støde på tilfælde, hvor en undergruppe af strygere eller strenge med valgfri komponenter skal matches. Substitutionsmetoderne kan naturligvis matche regelmæssige udtryk i stedet for statiske strenge. Dette giver dem mulighed for at være meget mere fleksible og matche praktisk talt enhver tekst, du kan drømme om.
Dette eksempel er en lidt mere reel verden. Forestil dig et sæt komma-adskilte værdier. Disse værdier indføres i et tabuleringsprogram, som du ikke har kontrol over (lukket) kilde). Programmet, der genererer disse værdier, er også lukket kilde, men det udsender nogle dårligt formaterede data. Nogle felter har mellemrum efter kommaet, og dette får tabulatorprogrammet til at gå i stykker.
En mulig løsning er at skrive et Ruby-program til at fungere som "lim" eller et filter mellem de to programmer. Dette Ruby-program løser eventuelle problemer i dataformateringen, så tabulatoren kan udføre sit job. For at gøre dette er det ganske enkelt: udskift et komma efterfulgt af et antal mellemrum med blot et komma.
#! / usr / bin / env ruby
STDIN.each do | l |
l.gsub! (/, + /, ",")
sætter l
ende
gsub $ kat data.txt
10, 20, 30
12.8, 10.4,11
gsub $ kat data.txt | ./2.rb
10,20,30
12.8,10.4,11
Fleksible udskiftninger
Forestil dig nu denne situation. Ud over den mindre formatering fejl, det program, der producerer dataene, producerer nummerdata i videnskabelig notation. Tabulatorprogrammet forstår ikke dette, så du bliver nødt til at erstatte det. En simpel gsub gør det naturligvis ikke her, fordi udskiftningen vil være anderledes, hver gang udskiftningen udføres.
Heldigvis kan substitutionsmetoderne blokere for substitutionsargumenterne. For hver gang søgestrengen findes, overføres teksten, der matchede søgestrengen (eller regex) til denne blok. Den værdi, der gives af blokken, bruges som substitutionsstreng. I dette eksempel er et flydende nummer i videnskabelig notationsform (som f.eks 1.232e4) konverteres til et normalt tal med et decimalpoint. Strengen konverteres til et tal med to_f, derefter formateres nummeret ved hjælp af en formatstreng.
#! / usr / bin / env ruby
STDIN.each do | l |
l.gsub! (/-?\d+\.\d+e-?\d+/) do | n |
"% .3f"% n.to_f
ende
l.gsub! (/, + /, ",")
sætter l
ende
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 kendt med regelmæssige udtryk?
Lad os tage et skridt tilbage og se på det almindelig udtryk. Det ser kryptisk og kompliceret ud, men det er meget enkelt. Hvis du ikke kender regelmæssige udtryk, kan de være ganske kryptiske. Når du først har kendt dem, er de ligefrem og naturlige metoder til at beskrive tekst. Der er et antal elementer, og flere af elementerne har kvantificatorer.
Det primære element her er \ d karakter klasse. Dette matcher ethvert ciffer, tegnene 0 til 9. Kvantificatoren + bruges sammen med cifretegnetklassen til at indikere, at et eller flere af disse cifre skal matches i en række. Du har tre grupper med cifre, to adskilt med en "."og den anden adskilt af brevet"e"(for eksponent).
Det andet element, der svæver rundt, er minus-tegnet, der bruger "?"kvantificer. Dette betyder "nul eller en" af disse elementer. Så kort sagt kan der være eller ikke være negative tegn i begyndelsen af nummeret eller eksponenten.
De to andre elementer er. (periode) karakter og e Karakter. Kombiner alt dette, så får du et regelmæssigt udtryk (eller sæt regler for matchende tekst), der matcher tal i videnskabelig form (f.eks. 12.34e56).