Sadalot auklu ir tikai viens veids, kā manipulēt ar virknes datiem. Varat arī veikt aizstājumus, lai aizstātu vienu virknes daļu ar citu. Piemēram, virknes paraugā (foo, bar, baz), aizstājot “foo” ar “boo”, tiktu iegūts “boo, bar, baz”. To un daudzas citas lietas varat izdarīt, izmantojot apakš un gsub metode stīgu klasē.
Daudzas iespējas rubīna aizvietošanai
Aizvietošanas metodes ir divu veidu. apakš Metode ir visvienkāršākā no divām, un ar to nāk vismazāk pārsteigumu. Tas vienkārši aizvieto izraudzītā modeļa pirmo instanci ar aizstāšanu.
Tā kā apakš aizstāj tikai pirmo instanci gsub metode aizvieto katru modeļa gadījumu ar aizstāšanu. Turklāt abi apakš un gsub ir sub! un gsub! kolēģi. Atcerieties, ka metodes Rubīns tā, kas beidzas ar izsaukuma zīmi, maina mainīgo vietā, nevis atdod modificētu kopiju.
Meklēt un aizstāt
Aizvietošanas metožu vienkāršākais lietojums ir vienas statiskās meklēšanas virknes aizstāšana ar vienu statiskās aizstāšanas virknes. Iepriekš minētajā piemērā vārdu "foo" aizstāja ar "boo". To var izdarīt, pirmoreiz parādoties "foo" virknē, izmantojot
apakš metodi vai ar visiem "foo" gadījumiem, izmantojot gsub metode.#! / usr / bin / env rubīns
a = "foo, bar, baz"
b = a.sub (“foo”, “boo”)
liek b
USD ./1.rb
foo, bārs, baz
gsub $ ./1.rb
boo, bar, baz
Elastīga meklēšana
Statisko virkņu meklēšana var notikt tikai tik tālu. Galu galā jūs nonāksit gadījumos, kad stīgas vai virknes ar izvēles komponentiem būs jāsaskaņo. Aizvietošanas metodes, protams, var atbilst regulārajām izteiksmēm statisko virkņu vietā. Tas viņiem ļauj būt daudz elastīgākiem un atbilst praktiski jebkuram tekstam, par kuru varat sapņot.
Šis piemērs ir nedaudz reālāka pasaule. Iedomājieties komatu atdalītu vērtību kopu. Šīs vērtības tiek ievadītas tabulācijas programmā, kuru jums nav nekādas kontroles (slēgta avots). Programma, kas ģenerē šīs vērtības, ir arī slēgts avots, taču tā izvada dažus slikti formatētus datus. Dažos laukos aiz komata ir atstarpes, un tas izraisa tabulatora programmas pārtraukumu.
Viens no iespējamiem risinājumiem ir uzrakstīt Ruby programmu, kas darbotos kā “līme” vai kā filtrs starp abām programmām. Šī Ruby programma novērsīs visas datu formatēšanas problēmas, lai tabulators varētu veikt savu darbu. Lai to izdarītu, tas ir pavisam vienkārši: nomainiet komatu, kam seko vairākas atstarpes, ar tikai komatu.
#! / usr / bin / env rubīns
STDIN.katru do | l |
l.gsub! (/, + /, ",")
liek l
beigas
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
Elastīgas nomaiņas
Tagad iedomājieties šo situāciju. Papildus nelielajam formatējumam kļūdas, programma, kas ražo datus, veido skaitļa datus zinātniskā norakstā. Tabulatoru programma to nesaprot, tāpēc jums tas būs jāaizstāj. Acīmredzot vienkāršs gsub šeit nedarīsies, jo aizstāšana katru reizi būs atšķirīga.
Par laimi, aizvietošanas metodes var aizstāt aizstāšanas argumentus. Katru reizi, kad tiek atrasta meklēšanas virkne, teksts, kas atbilda meklēšanas virknei (vai regex), tiek pārsūtīts uz šo bloku. Bloka iegūtā vērtība tiek izmantota kā aizstāšanas virkne. Šajā piemērā peldošā komata numurs zinātniskās nošu formā (piemēram, 1.232e4) tiek pārveidots par parastu skaitli ar decimālzīmi. Virkne tiek pārveidota par skaitli ar to_f, tad skaitlis tiek formatēts, izmantojot formāta virkni.
#! / usr / bin / env rubīns
STDIN.katru do | l |
l.gsub! (/-?\d+\.\d+e-?\d+/) do | n |
"% .3f"% n.to_f
beigas
l.gsub! (/, + /, ",")
liek l
beigas
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
Vai neesat pazīstams ar parastajiem izteicieniem?
Mēģināsim soli atpakaļ un apskatīsim to regulāra izteiksme. Tas izskatās noslēpumains un sarežģīts, bet tas ir ļoti vienkārši. Ja jūs neesat pazīstams ar regulārām izteiksmēm, tās var būt diezgan noslēpumainas. Tomēr, tiklīdz jūs tos pazīstat, viņi izmanto vienkāršas un dabiskas teksta aprakstīšanas metodes. Ir vairāki elementi, un vairākiem no tiem ir kvantifikatori.
Galvenais elements šeit ir \ d rakstura klase. Tas atbildīs jebkuram ciparam, burtiem no 0 līdz 9. Kvantifikators + tiek izmantots kopā ar ciparu rakstzīmju klasi, lai norādītu, ka viens vai vairāki no šiem cipariem ir jāsaskaņo pēc kārtas. Jums ir trīs ciparu grupas, divas atdalot ar "."un otru atdala ar burtu"e"(eksponentam).
Otrais elements, kas peld apkārt, ir mīnusa zīme, kurā tiek izmantots simbols “?"skaitlis. Tas nozīmē "nulle vai viens" no šiem elementiem. Tātad, īsi sakot, skaitļa vai eksponenta sākumā var būt vai nebūt negatīvas zīmes.
Pārējie divi elementi ir. (perioda) raksturs un e raksturs. Apvieno to visu, un jūs iegūstat regulāru izteiksmi (vai noteikumu kopumu teksta saskaņošanai), kas atbilst skaitļiem zinātniskā formā (piemēram, 12.34e56).