Hoe String Substitution in Ruby te gebruiken

Een string splitsen is slechts één manier om stringgegevens te manipuleren. U kunt ook vervangingen uitvoeren om een ​​deel van een string door een andere string te vervangen. In een voorbeeldreeks (foo, bar, baz) zou het vervangen van "foo" door "boo" bijvoorbeeld "boo, bar, baz" opleveren. U kunt dit en nog veel meer dingen doen met de sub en gsub methode in de tekenreeksklasse.

Veel opties voor Ruby-vervanging

De vervangingsmethoden zijn er in twee varianten. De sub methode is de meest elementaire van de twee en komt met het minste aantal verrassingen. Het vervangt eenvoudigweg de eerste instantie van het aangewezen patroon door de vervanging.

Terwijl sub vervangt alleen de eerste instantie, de gsub methode vervangt elk exemplaar van het patroon door de vervanging. Bovendien beide sub en gsub hebben sub! en gsub! tegenhangers. Onthoud, methoden in Robijn die eindigen op een uitroepteken veranderen de variabele op zijn plaats in plaats van een gewijzigde kopie terug te geven.

Zoeken en vervangen

instagram viewer

Het meest basale gebruik van de substitutiemethoden is het vervangen van één statische zoekreeks door één statische vervangende reeks. In het bovenstaande voorbeeld is 'foo' vervangen door 'boo'. Dit kan gedaan worden voor de eerste keer dat "foo" in de string voorkomt met de sub methode of met alle gevallen van "foo" met behulp van de gsub methode.

#! / usr / bin / env robijn
a = "foo, bar, baz"
b = a.sub ("foo", "boo")
zet b
$ ./1.rb
foo, bar, baz
gsub $ ./1.rb
boe, bar, baz

Flexibel zoeken

Zoeken naar statische snaren kan alleen zo ver gaan. Uiteindelijk kom je gevallen tegen waarin een subset van snaren of strings met optionele componenten moeten op elkaar worden afgestemd. De vervangingsmethoden kunnen natuurlijk overeenkomen met reguliere expressies in plaats van statische tekenreeksen. Hierdoor zijn ze veel flexibeler en passen ze bij vrijwel elke tekst die je maar kunt bedenken.

Dit voorbeeld is een beetje meer echte wereld. Stel je een reeks door komma's gescheiden waarden voor. Deze waarden worden ingevoerd in een tabulatieprogramma waarover u geen controle heeft (gesloten bron). Het programma dat deze waarden genereert, is ook een gesloten bron, maar het levert een aantal slecht opgemaakte gegevens op. Sommige velden hebben spaties achter de komma en hierdoor wordt het tabulatorprogramma afgebroken.

Een mogelijke oplossing is om een ​​Ruby-programma te schrijven dat als "lijm" of als een filter tussen de twee programma's fungeert. Dit Ruby-programma lost eventuele problemen met de gegevensopmaak op, zodat de tabulator zijn werk kan doen. Om dit te doen, is het vrij eenvoudig: vervang een komma gevolgd door een aantal spaties door alleen een komma.

#! / usr / bin / env robijn
STDIN. Elk do | l |
l.gsub! (/, + /, ",")
zet l
einde
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

Flexibele vervangingen

Stel je nu deze situatie eens voor. Naast de kleine opmaak fouten, het programma dat de gegevens produceert, produceert getalsgegevens in wetenschappelijke notatie. Het tabulatorprogramma begrijpt dit niet, dus u zult het moeten vervangen. Het is duidelijk dat een eenvoudige gsub hier niet werkt, omdat de vervanging elke keer dat de vervanging wordt gedaan, anders zal zijn.

Gelukkig kunnen de substitutiemethoden de substitutieargumenten blokkeren. Voor elke keer dat de zoekstring wordt gevonden, wordt de tekst die overeenkomt met de zoekstring (of regex) aan dit blok doorgegeven. De waarde die het blok oplevert, wordt gebruikt als de substitutiereeks. In dit voorbeeld een drijvende-kommagetal in wetenschappelijke notatievorm (zoals 1.232e4) wordt omgezet in een normaal getal met een decimaalteken. De string wordt omgezet naar een getal met to_f, dan wordt het nummer opgemaakt met een format string.

#! / usr / bin / env robijn
STDIN. Elk do | l |
l.gsub! (/-?\d+\.\d+e-?\d+/) doen | n |
"% .3f"% n.to_f
einde
l.gsub! (/, + /, ",")
zet l
einde
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

Niet bekend met reguliere uitdrukkingen?

Laten we een stap terug doen en daar naar kijken reguliere expressie. Het ziet er cryptisch en ingewikkeld uit, maar het is heel eenvoudig. Als je niet bekend bent met reguliere expressies, kunnen ze behoorlijk cryptisch zijn. Als u ze echter eenmaal kent, zijn het eenvoudige en natuurlijke methoden om tekst te beschrijven. Er zijn een aantal elementen en verschillende elementen hebben kwantoren.

Het belangrijkste element hier is de \ d tekenklasse. Dit komt overeen met elk cijfer, de karakters 0 tot en met 9. De kwantor + wordt gebruikt met de cijferkarakterklasse om aan te geven dat een of meer van deze cijfers op een rij moeten worden gevonden. Je hebt drie groepen cijfers, twee gescheiden door een ".'en de andere gescheiden door de letter'e"(voor exponent).

Het tweede element dat rondzweeft, is het minteken, dat de "?"kwantor. Dit betekent "nul of één" van deze elementen. Kortom, er kunnen al dan niet negatieve tekens aan het begin van het getal of de exponent staan.

De twee andere elementen zijn de. (punt) karakter en de e karakter. Combineer dit alles en je krijgt een reguliere expressie (of een set regels voor overeenkomende tekst) die overeenkomt met getallen in wetenschappelijke vorm (zoals 12.34e56).

instagram story viewer