Împărțirea unui șir este doar o modalitate de a manipula datele șirului. Puteți, de asemenea, să faceți substituții pentru a înlocui o parte a unui șir cu o altă șir. De exemplu, într-un exemplu șir (foo, bar, baz) înlocuirea „foo” cu „boo” în ar produce „boo, bar, baz”. Puteți face acest lucru și multe alte lucruri folosind funcția Sub și gsub metoda din clasa string.
Multe opțiuni pentru înlocuirea rubinului
Metodele de înlocuire vin în două soiuri. Sub metoda este cea mai de bază dintre cele două și vine cu cel mai mic număr de surprize. Înlocuiește pur și simplu prima instanță a modelului desemnat cu înlocuirea.
Întrucât Sub înlocuiește doar prima instanță, gsub metoda înlocuiește fiecare instanță a modelului cu înlocuirea. În plus, ambele Sub și gsub avea Sub! și gsub! omologii. Amintiți-vă, metode în Rubin acel final într-un punct de exclamare modifică variabila în loc în loc să returneze o copie modificată.
Căutați și înlocuiți
Cea mai de bază utilizare a metodelor de substituție este de a înlocui un șir de căutare static cu un șir de înlocuire static. În exemplul de mai sus, „foo” a fost înlocuit cu „boo”. Acest lucru se poate face pentru prima apariție de "foo" în șir folosind
Sub metoda sau cu toate aparițiile "foo" folosind gsub metodă.#! / usr / bin / env ruby
a = "foo, bar, baz"
b = a.sub ("foo", "boo")
pune b
$ ./1.rb
foo, bar, baz
gsub $ ./1.rb
boo, bar, baz
Căutare flexibilă
Căutarea șirurilor statice poate merge doar atât de departe. În cele din urmă, veți rula în cazuri în care un subset de siruri de caractere sau șirurile cu componente opționale vor trebui să fie potrivite. Metodele de substituție pot, desigur, să corespundă expresiilor obișnuite în loc de șiruri statice. Acest lucru le permite să fie mult mai flexibile și să se potrivească practic cu orice text puteți visa.
Acest exemplu este o lume ceva mai reală. Imaginați-vă un set de valori separate prin virgulă. Aceste valori sunt introduse într-un program de tabulare peste care nu aveți niciun control (închis sursă). Programul care generează aceste valori este de asemenea o sursă închisă, dar produce date neformatate. Unele câmpuri au spații după virgulă și acest lucru determină ruperea programului tabulator.
O soluție posibilă este să scrieți un program Ruby pentru a acționa ca „lipici” sau un filtru între cele două programe. Acest program Ruby va rezolva problemele legate de formatarea datelor, astfel încât tabulatorul își poate face treaba. Pentru a face acest lucru, este destul de simplu: înlocuiți o virgulă urmată de o serie de spații cu doar o virgulă.
#! / usr / bin / env ruby
STDIN.each do | l |
l.gsub! (/, + /, ",")
pune l
Sfârșit
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
Înlocuirile flexibile
Acum imaginați-vă această situație. Pe lângă formatarea minoră erori, programul care produce datele produce date cu număr în notație științifică. Programul tabulator nu înțelege acest lucru, așa că va trebui să îl înlocuiți. Evident, un simplu gsub nu va face aici, deoarece înlocuirea va fi diferită de fiecare dată când se va înlocui.
Din fericire, metodele de substituție pot lua un bloc pentru argumentele de substituție. De fiecare dată când se găsește șirul de căutare, textul care se potrivește cu șirul de căutare (sau regex) este trecut la acest bloc. Valoarea obținută de bloc este folosită ca șir de substituție. În acest exemplu, un număr de punct flotant în formă de notație științifică (de ex 1.232e4) este convertit la un număr normal cu punct zecimal. Șirul este convertit la un număr cu to_f, apoi numărul este formatat folosind un șir de format.
#! / usr / bin / env ruby
STDIN.each do | l |
l.gsub! (/-?\d+\.\d+e-?\d+/) do | n |
"% .3f"% n.to_f
Sfârșit
l.gsub! (/, + /, ",")
pune l
Sfârșit
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
Nu sunteți familiarizat cu expresiile regulate?
Să facem un pas înapoi și să ne uităm la asta expresie uzuala. Pare criptic și complicat, dar este foarte simplu. Dacă nu sunteți familiarizat cu expresiile obișnuite, ele pot fi destul de criptice. Cu toate acestea, odată ce le cunoști, acestea sunt metode simple și naturale de descriere a textului. Există o serie de elemente și mai multe dintre ele au cuantificatori.
Elementul principal aici este \ d clasa de personaje. Aceasta se va potrivi cu orice cifră, caracterele de la 0 la 9. Cuantificatorul + este utilizat împreună cu clasa de caractere cifre pentru a semnifica că una sau mai multe dintre aceste cifre ar trebui să fie potrivite la rând. Aveți trei grupuri de cifre, două separate de un "."și cealaltă separată cu litera"e"(pentru exponent).
Al doilea element care plutește este caracterul minus, care folosește "?„cuantificator. Aceasta înseamnă „zero sau unul” dintre aceste elemente. Deci, pe scurt, pot exista sau nu semne negative la începutul numărului sau al exponentului.
Celelalte două elemente sunt. (perioada) caracterului și e caracter. Combinați toate acestea și veți obține o expresie regulată (sau un set de reguli pentru potrivirea textului) care se potrivește cu numerele în formă științifică (cum ar fi 12.34e56).