După cum poate știți deja, șirurile din Ruby sunt ceea ce sunt cunoscute sub numele de obiecte de primă clasă, care folosesc o serie de metode pentru interogări și manipulări.
Una dintre cele mai de bază acțiuni de manipulare a șirurilor este divizarea unui șir în mai multe sub-șiruri. Acest lucru s-ar face, de exemplu, dacă aveți un șir ca"foo, bar, baz" și vrei cele trei șiruri „foo”, „bar” și „baz”. Despică metoda clasei String poate realiza acest lucru pentru tine.
Cea mai de bază utilizare a Despică metoda constă în împărțirea unui șir bazat pe un singur caracter sau o secvență statică de caractere. Dacă primul argument al împărțirii este un șir, caracterele din șirul respectiv sunt folosite ca delimitator de separare a șirurilor, în timp ce în datele delimitate de virgule, virgula este folosită pentru a separa datele.
#! / usr / bin / env ruby
str = "foo, bar, baz"
pune str.split (",")
$ ./1.rb
foo
bar
Baz
Există modalități mai ușoare de a delimita șirul. Utilizarea unei expresii obișnuite ca delimitator face mai flexibilă metoda de împărțire.
Din nou, luați de exemplu șirul "foo, bar, baz". Există un spațiu după prima virgulă, dar nu și după a doua. Dacă șirul „,” este folosit ca delimitator, un spațiu va exista încă la începutul șirului „bar”. Dacă se folosește șirul „,” (cu un spațiu după virgulă), se va potrivi cu prima virgulă, deoarece a doua virgulă nu are spațiu după ea. Este foarte limitativ.
Soluția la această problemă este să folosiți o expresie regulată ca argument de delimitare în loc de șir. Expresiile regulate vă permit să potriviți nu numai secvențe statice de caractere, ci și numere indeterminate de caractere și caractere opționale.
Când scrieți o expresie obișnuită pentru delimitatorul dvs., primul pas este să descrieți în cuvinte care este delimitatorul. În acest caz, sintagma „o virgulă care ar putea fi urmată de unul sau mai multe spații” este rezonabilă.
Există două elemente pentru această regex: virgula și spațiile opționale. Spațiile vor folosi cuantificatorul * (stea sau asterisc), ceea ce înseamnă „zero sau mai mult”. Orice element care preced acest lucru se va potrivi cu zero sau mai multe ori. De exemplu, regexul /A*/ va potrivi o secvență de zero sau mai multe caractere „a”.
#! / usr / bin / env ruby
str = "foo, bar, baz"
pune str.split (/, * /)
$ ./2.rb
foo
bar
Baz
Imaginează-ți un șir de valori separat de virgule, cum ar fi "10,20,30, Acesta este un șir arbitrar". Acest format este format din trei numere urmate de o coloană de comentarii. Această coloană de comentarii poate conține text arbitrar, inclusiv text cu virgule în ea. A preveni Despică de la împărțirea textului acestei coloane, putem seta un număr maxim de coloane pentru a împărți.
Notă: Acest lucru va funcționa numai dacă șirul de comentarii cu textul arbitrar este ultima coloană a tabelului.
Pentru a limita numărul de divizii se va efectua metoda de divizare, treceți numărul de câmpuri din șir ca un al doilea argument la metoda de împărțire, astfel:
#! / usr / bin / env ruby
str = "10,20,30, Zece, Douăzeci și Treizeci"
pune str.split (/, * /, 4)
$ ./3.rb
10
20
30
Zece, douăzeci și treizeci
Ce se întâmplă dacă vrei să folosești Despică pentru a obține toate articolele, dar chiar primul?
De fapt este foarte simplu:
în primul rând, * rest = ex.split (/, /)
Metoda de împărțire are unele limite destul de mari.
Luăm de exemplu șirul '10, 20, "Bob, Eve and Mallory", 30 '. Ceea ce este destinat este două numere, urmate de un șir citat (care poate conține virgule) și apoi un alt număr. Split nu poate separa corect acest șir în câmpuri.
Pentru a face acest lucru, scanerul cu șiruri trebuie să fie statefull, ceea ce înseamnă că își poate aminti dacă este în interiorul unui șir citat sau nu. Scanerul despărțit nu este statistic, deci nu poate rezolva probleme ca acesta.