Stringvervanging gebruiken in Ruby

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

Veel opties voor Ruby-vervanging

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

Terwijl sub vervangt alleen de eerste instantie, de gsub methode vervangt elke instantie van het patroon door de vervanging. Bovendien beide sub en gsub hebben sub! en gsub! tegenhangers. Vergeet niet dat methoden in Ruby die eindigen op een uitroepteken de variabele in plaats wijzigen in plaats van een gewijzigde kopie terug te geven.

Zoeken en vervangen

Het meest elementaire gebruik van de vervangingsmethoden is het vervangen van één statische zoekreeks door één statische vervangingsreeks. In het bovenstaande voorbeeld werd "foo" vervangen door "boo". Dit kan worden gedaan voor de eerste keer dat "foo" in de string voorkomt met behulp van de sub methode of bij alle gevallen van "foo" met behulp van de gsub methode.

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

Flexibel zoeken

Zoeken naar statische strings kan alleen zo ver gaan. Uiteindelijk zul je gevallen tegenkomen waarin een subset van strings of strings met optionele componenten moet worden gekoppeld. De substitutiemethoden kunnen natuurlijk overeenkomen met reguliere expressies in plaats van statische tekenreeksen. Hierdoor kunnen ze veel flexibeler zijn en vrijwel elke tekst matchen 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 hebt (gesloten bron). Het programma dat deze waarden genereert, is ook een gesloten bron, maar het voert een aantal slecht geformatteerde gegevens uit. Sommige velden hebben spaties achter de komma en hierdoor wordt het tabulatorprogramma afgebroken.

Een mogelijke oplossing is om een ​​Ruby-programma te schrijven om als "lijm" of een filter tussen de twee programma's te fungeren. Dit Ruby-programma lost 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 ruby
STDIN.each 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 deze situatie eens voor. Naast de kleine opmaakfouten produceert het programma dat de gegevens produceert, nummergegevens 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 is voltooid anders zal zijn.

Gelukkig kunnen de substitutiemethoden een blok nemen voor de substitutieargumenten. Voor elke keer dat de zoekreeks wordt gevonden, wordt de tekst die overeenkomt met de zoekreeks (of regex) aan dit blok doorgegeven. De waarde die het blok oplevert, wordt gebruikt als de vervangingsreeks. In dit voorbeeld een getal met drijvende komma in de vorm van een wetenschappelijke notatie (zoals 1.232e4) wordt omgezet in een normaal getal met een decimaalteken. De tekenreeks wordt omgezet in een getal met to_f, vervolgens wordt het nummer opgemaakt met behulp van een opmaakreeks.

#! / usr / bin / env ruby
STDIN.each do | l |
l.gsub! (/-?\d+\.\d+e-?\d+/) do | 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 expressies?

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

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

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

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