Rozdeľte reťazec je iba jedným zo spôsobov manipulácie s reťazcovými dátami. Môžete tiež vykonať substitúcie, aby ste nahradili jednu časť reťazca iným reťazcom. Napríklad v príkladovom reťazci (foo, bar, baz) nahradením výrazu „foo“ výrazom „boo“ by sa získala hodnota „boo, bar, baz.“ Môžete to urobiť a mnoho ďalších vecí pomocou náhradník a gsub metóda v triede strún.
Mnoho možností pre náhradu za Ruby
Substitučné metódy sa dodávajú v dvoch variantoch. náhradník metóda je najzákladnejšou z týchto dvoch metód a prichádza s najmenším počtom prekvapení. Nahrádza iba prvú inštanciu určeného vzoru.
kdežto náhradník nahrádza iba prvú inštanciu gsub metóda nahradí každú inštanciu vzoru nahradením. Okrem toho oboje náhradník a gsub mať sub! a gsub! náprotivky. Pamätajte, metódy v rubín ktoré končia výkričníkom, menia premennú namiesto toho, aby vracali upravenú kópiu.
Vyhľadajte a nahradiť
Najzákladnejšie použitie substitučných metód je nahradiť jeden statický vyhľadávací reťazec jedným statickým náhradným reťazcom. Vo vyššie uvedenom príklade bolo slovo „foo“ nahradené slovom „boo“. Toto je možné urobiť pre prvý výskyt "foo" v reťazci pomocou
náhradník metóda alebo so všetkými výskytmi "foo" pomocou gsub metóda.#! / usr / bin / env ruby
a = "foo, bar, baz"
b = a.sub („foo“, „boo“)
kladie b
$ ./1.rb
foo, bar, baz
gsub $ ./1.rb
boo, bar, baz
Flexibilné vyhľadávanie
Vyhľadávanie statických reťazcov môže ísť len tak ďaleko. Nakoniec narazíte na prípady, keď podmnožina reťazce alebo reťazce s voliteľnými komponentmi bude potrebné spárovať. Substitučné metódy môžu samozrejme zodpovedať regulárnym výrazom namiesto statických reťazcov. To im umožňuje byť oveľa flexibilnejší a porovnávať prakticky akýkoľvek text, ktorý si môžete vysniť.
Tento príklad je trochu skutočnejší svet. Predstavte si súbor hodnôt oddelených čiarkami. Tieto hodnoty sa prenášajú do tabuľkového programu, nad ktorým nemáte žiadnu kontrolu (zatvorené) zdroj). Program, ktorý generuje tieto hodnoty, je tiež uzavretým zdrojom, ale vydáva niektoré zle formátované údaje. Niektoré polia majú za čiarkou medzery a to spôsobuje zlomenie tabelátorového programu.
Jedným z možných riešení je napísať program Ruby, ktorý bude pôsobiť ako „lepidlo“ alebo filter medzi týmito dvoma programami. Tento program Ruby vyrieši všetky problémy s formátovaním údajov, aby tabelátor mohol vykonávať svoju prácu. Ak to chcete urobiť, je to celkom jednoduché: nahradiť čiarku nasledovanú niekoľkými medzerami čiarkou.
#! / usr / bin / env ruby
STDIN.each do | l |
l.gsub! (/, + /, ",")
kladie l
koniec
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
Flexibilné výmeny
Teraz si predstavte túto situáciu. Okrem menšieho formátovania chyby, program, ktorý údaje vytvára, vytvára vo vedeckom zápise číselné údaje. Tabulátor program tomu nerozumie, takže ho budete musieť nahradiť. Je zrejmé, že jednoduchý gsub tu neurobí, pretože nahradenie sa bude meniť zakaždým, keď sa vykoná výmena.
Našťastie substitučné metódy môžu blokovať substitučné argumenty. Zakaždým, keď sa vyhľadávací reťazec nájde, text, ktorý sa zhodoval s vyhľadávacím reťazcom (alebo regexom), prechádza do tohto bloku. Hodnota poskytnutá blokom sa použije ako substitučný reťazec. V tomto príklade je číslo s pohyblivou rádovou čiarkou vo forme vedeckej notácie (napr 1.232e4) sa prevádza na normálne číslo s desatinnou čiarkou. Reťazec sa skonvertuje na číslo pomocou to_f, potom sa číslo naformátuje pomocou formátovacieho reťazca.
#! / usr / bin / env ruby
STDIN.each do | l |
l.gsub! (/-?\d+\.\d+e-?\d+/) do | n |
"% .3f"% n.to_f
koniec
l.gsub! (/, + /, ",")
kladie l
koniec
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
Nie ste oboznámení s regulárnymi výrazmi?
Poďme o krok späť a pozrime sa na to regulárny výraz. Vyzerá to tajne a komplikovane, ale je to veľmi jednoduché. Ak nie ste oboznámení s regulárnymi výrazmi, môžu byť dosť záhadní. Keď ich však poznáte, sú to jednoduché a prirodzené metódy popisu textu. Existuje niekoľko prvkov a niektoré z nich majú kvantifikátory.
Primárnym prvkom je tu \ d trieda znakov. To sa bude zhodovať s každou číslicou, znakmi 0 až 9. Kvantifikátor + sa používa s triedou znakových číslic na označenie, že jedna alebo viac z týchto číslic by sa mali zhodovať v riadku. Máte tri skupiny číslic, dve oddelené znakom „.„a ďalšie písmeno oddelené písmenom“e„(pre exponent).
Druhým prvkom pohybujúcim sa okolo je znak mínus, ktorý používa znak „?"kvantifikátor. To znamená „nula alebo jeden“ z týchto prvkov. Stručne povedané, na začiatku čísla alebo exponentu môžu alebo nemusia byť záporné znaky.
Ďalšími dvoma prvkami sú:. (obdobie) charakter a e charakteru. Kombinujte to všetko a získate regulárny výraz (alebo množinu pravidiel pre zodpovedajúci text), ktorý zodpovedá číslam vo vedeckej forme (napríklad 12.34e56).