Hur man använder strängsubstitution i Ruby

click fraud protection

Dela upp en sträng är bara ett sätt att manipulera strängdata. Du kan också göra ersättningar för att ersätta en del av en sträng med en annan sträng. Till exempel skulle i ett exempelsträng (foo, bar, baz) ersätta "foo" med "boo" i "boo, bar, baz." Du kan göra detta och många fler saker med sub och gsub metod i strängklassen.

Många alternativ för rubinersättning

Substitutionsmetoderna finns i två sorter. De sub metoden är den mest grundläggande av de två och kommer med minst antal överraskningar. Den ersätter helt enkelt den första instansen av det angivna mönstret med ersättningen.

medan sub ersätter bara första instansen, gsub metoden ersätter varje instans av mönstret med ersättningen. Dessutom båda sub och gsub ha sub! och gsub! motsvarigheter. Kom ihåg, metoder i Rubin som slutar i ett utropstecken ändrar variabeln på plats istället för att returnera en modifierad kopia.

Sök och ersätt

Den mest grundläggande användningen av substitutionsmetoderna är att ersätta en statisk söksträng med en statisk ersättningssträng. I exemplet ovan ersattes "foo" med "boo". Detta kan göras för den första förekomsten av "foo" i strängen med hjälp av

instagram viewer
sub metod eller med alla förekomster av "foo" med hjälp av gsub metod.

#! / 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

Flexibel sökning

Sökning efter statiska strängar kan bara gå så långt. Så småningom kommer du att stöta på fall där en delmängd av strängar eller strängar med valfria komponenter måste matchas. Substitutionsmetoderna kan naturligtvis matcha regelbundna uttryck istället för statiska strängar. Detta gör att de kan vara mycket mer flexibla och matcha praktiskt taget alla texter du kan drömma om.

Detta exempel är lite mer verklig värld. Föreställ dig en uppsättning kommaseparerade värden. Dessa värden matas in i ett tabuleringsprogram som du inte har någon kontroll över (stängd källa). Programmet som genererar dessa värden är också stängd källa, men det matar ut något dåligt formaterad data. Vissa fält har mellanslag efter kommatecken och detta gör att tabulatorprogrammet går sönder.

En möjlig lösning är att skriva ett Ruby-program för att fungera som "lim" eller ett filter mellan de två programmen. Detta Ruby-program kommer att åtgärda eventuella problem i dataformateringen så att tabulatorn kan göra sitt jobb. För att göra detta är det ganska enkelt: ersätt ett komma följt av ett antal utrymmen med bara ett komma.

#! / usr / bin / env ruby
STDIN.each do | l |
l.gsub! (/, + /, ",")
sätter l
slutet
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

Flexibla ersättningar

Föreställ dig nu denna situation. Förutom den mindre formateringen fel, programmet som producerar uppgifterna producerar nummerdata i vetenskaplig notation. Tabulatorprogrammet förstår inte detta, så du måste byta ut det. Naturligtvis kommer en enkel gsub inte att göra här eftersom utbytet kommer att vara annorlunda varje gång utbytet görs.

Lyckligtvis kan substitutionsmetoderna ta ett block för substitutionsargumenten. För varje gång söksträngen hittas överförs texten som matchade söksträngen (eller regex) till detta block. Värdet som ges av blocket används som substitutionssträng. I det här exemplet är ett flytande punktnummer i vetenskaplig notationsform (t.ex. 1.232e4) konverteras till ett normalt antal med en decimalpunkt. Strängen konverteras till ett nummer med till F, sedan formateras numret med en formatsträng.

#! / usr / bin / env ruby
STDIN.each do | l |
l.gsub! (/-?\d+\.\d+e-?\d+/) do | n |
"% .3f"% n.to_f
slutet
l.gsub! (/, + /, ",")
sätter l
slutet
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

Känner du inte till vanliga uttryck?

Låt oss ta ett steg tillbaka och titta på det vanligt uttryck. Det ser kryptiskt och komplicerat ut, men det är väldigt enkelt. Om du inte känner till vanliga uttryck kan de vara ganska kryptiska. Men när du väl är bekant med dem är de enkla och naturliga metoder för att beskriva text. Det finns ett antal element, och flera av elementen har kvantifierare.

Det primära elementet här är \ d karaktär klass. Detta kommer att matcha alla siffror, tecken 0 till 9. Kvantifieraren + används med siffrateckenklassen för att beteckna att en eller flera av dessa siffror ska matchas i rad. Du har tre siffragrupper, två separerade med en "."och den andra åtskilda med bokstaven"e"(för exponent).

Det andra elementet som flyter runt är minus-karaktären, som använder "?"kvantifierare. Detta betyder "noll eller en" av dessa element. Så kort sagt kan det finnas negativa tecken i början av numret eller exponenten.

De två andra elementen är. (period) karaktär och e karaktär. Kombinera allt detta så får du ett regelbundet uttryck (eller uppsättning regler för matchande text) som matchar siffror i vetenskaplig form (t.ex. 12.34e56).

instagram story viewer