Ruby pentru începători Expresii regulate

Ruby este una dintre cele mai populare limbi folosite pe web. Am început o nouă sesiune aici pe Nettuts +, care vă va prezenta Ruby, precum și marile cadre și instrumente care merg împreună cu dezvoltarea Ruby. În această lecție, vom analiza utilizarea expresiei regulate în Ruby.


Prefer un Video Tutorial?


Prefață: Sintaxă de expresie regulată

Dacă sunteți familiarizat cu expresii regulate, veți fi bucuroși să știți că cea mai mare parte a sintaxei pentru scrierea expresiilor regulate reale este foarte asemănătoare cu ceea ce cunoașteți din PHP, JavaScript sau [limba dvs. aici].

Dacă nu sunteți familiarizat cu expresii regulate, veți dori să consultați tutorialele noastre Regex aici pe Nettuts + pentru a obține până la viteză.


Ordonarea expresiilor regulate

La fel ca orice altceva în Ruby, expresiile regulate sunt obiecte obișnuite: sunt exemple ale regexp clasă. Cu toate acestea, veți crea, de obicei, o expresie regulată cu sintaxa standard, literală:

/ myregex / / \ (\ d 3 \) \ d 3 - \ d 4 /

Pentru a începe, cea mai simplă modalitate de a utiliza o regexp este să o aplicați unui șir și să vedeți dacă există o potrivire. Ambele șiruri și obiectele regexp au a Meci metoda care face acest lucru:

"(3) - \ d 3 - \ d 3 - \ d 4 / match "(123) 456-7890"

Ambele exemple se potrivesc și, prin urmare, vom obține o MatchData înapoi (ne vom uita la MatchData obiecte în curând). Dacă nu există nici o potrivire, Meci va reveni zero. Pentru că a MatchData obiect va evalua la Adevărat, puteți utiliza Meci metoda în declarații condiționale (ca o instrucțiune if) și ignorați că obțineți o valoare de returnare.

Există o altă metodă pe care o puteți utiliza pentru a se potrivi cu regexp cu șiruri de caractere: asta este = ~ (operatorul equals-tilde). Amintiți-vă că operatorii sunt metode în Ruby. Ca Meci, această metodă revine zero pe nici un meci. Cu toate acestea, dacă există o potrivire, va reveni poziția numerică a șirului în care a început meciul. De asemenea, cum ar fi meciul, atât și șiruri de caractere și regexps = ~.

"Ruby pentru începători: Expresii regulate" = ~ / New / # => 9

Expresiile regulate devin mai utile atunci când descoperim unele date. Acest lucru se face, de obicei, cu grupări: împachetarea anumitor părți ale expresiei regulate în paranteze. Să presupunem că dorim să potriviți un nume, prenume și ocupație într-un șir, unde șirul este formatat astfel:

str1 = "Joe Schmo, instalator" str2 = "Stephen Harper, prim-ministru"

Pentru a obține cele trei câmpuri, vom crea acest regexp:

(\ w \ s] *) / / \ w \

Aceasta corespunde oricărui număr de caractere de cuvânt, un spațiu alb, orice număr de caractere de cuvinte, o virgulă, unele spații opționale opționale și orice număr de caractere sau spații albe. Așa cum ați putea ghici, părțile, inclusiv personajele de cuvinte, se referă la numele sau ocupația pe care o căutăm, astfel încât acestea sunt înfășurate în paranteze.

Deci, să executăm acest lucru:

match1 = str1.match re match2 = str2.match re

Obiecte MatchData

Acum, ale noastre match1 și match2 variabilele dețin MatchData obiecte (pentru că ambele meciuri au avut succes). Deci, să vedem cum putem folosi aceste lucruri MatchData obiecte.

Pe măsură ce treceți prin aceasta, veți observa că există câteva moduri diferite de a obține aceleași date din cele ale noastre MatchData obiect. Vom începe cu șirul de potrivire: dacă doriți să vedeți ce șir original a fost potrivire cu regexp, utilizați şir metodă. De asemenea, puteți utiliza funcția [] (paranteze pătrate) și treceți parametrul 0:

match1.string # => "Joe Schmo, instalator" match1 [0] # (acesta este același lucru cu meciul1) [] 0) => "Joe Schmo, instalator"

Cum rămâne cu expresia obișnuită? Puteți găsi acest lucru cu regexp metodă.

match1.regex # => wsw, s [ws] (aceasta este modalitatea unică de a afișa expresii regulate ale IRB, care va funcționa în mod normal)

Acum, cum să obțineți acele grupuri potrivite care au fost punctul de vedere al acestui exercițiu? În primul rând, le putem obține cu indicii numerotați pe MatchData obiect în sine; desigur, ele sunt în ordinea în care le-am împărțit în:

=> "Joe" match1 [2] # => Match "Schmo" 1 [3] # => Match " match2 [3] # => "Primul ministru"

Există de fapt un alt mod de a obține aceste capturi: asta e cu proprietatea matricei captures; deoarece aceasta este o matrice, este bazată pe zero.

match1.captures [0] # => "Joe" match2.captures [2] # => "Premierul"

Credeți sau nu, este de fapt oa treia modalitate de a obține capturile voastre. Când executați Meci sau = ~, Ruby umple o serie de variabile globale, câte unul pentru fiecare dintre grupurile capturate din regexp:

"Andrew Burgess" .match / (\ w *) \ s (\ w *) / # returnează un obiect MatchData, dar ignorăm faptul că $ 1 # => "Andrew"

Înapoi la MatchData obiecte. Dacă doriți să aflați indexul de șir al unei capturări date, treceți numărul capturilor la începe (aici, doriți numărul de captură așa cum ați folosi cu [] metoda, nu prin captures). Alternativ, puteți utiliza Sfârșit pentru a vedea când se încheie captura.

m = "martor 1" => 8 m [2] # => "sfârșit" m.end 2 # => 14

Există și înainte de meci și post_match metode, care sunt destul de curat: aceasta vă arată ce parte din șir a venit înainte și după meci, respectiv.

# m de mai sus m.pre_match # => "Nettuts +" m.post_match # => "cel mai bun"

Aceasta acoperă destul de mult principiile de lucru cu expresii regulate în Ruby.


Expresie folosită regulat

Deoarece expresiile regulate sunt atât de utile atunci când manipulați șiruri de caractere, veți găsi mai multe metode de șir care să profite de ele. Cele mai utile sunt probabil metodele de substituire. Acestea includ

  • Sub
  • Sub!
  • gsub
  • gsub!

Acestea sunt pentru substituție și înlocuire globală, respectiv. Diferența este aceea gsub înlocuiește toate instanțele modelului nostru, în timp ce Sub înlocuiește numai prima instanță din șir.

Iată cum le folosim:

"un șir" .sub / string /, "message" # => "un mesaj" "Omul din parc" .gsub / a, "a" # => "

După cum probabil știți, metodele de bang (cele care se termină cu un semn de exclamare!) Sunt metode distructive: acestea schimbă obiectele reale de șir, în loc să le întoarcă acum. De exemplu:

original = "Numele meu este Andrew." new = original.sub / Numele meu este /, "Bună, eu sunt" originale # => Numele meu este Andrew. "nou # =>" Bună, eu sunt Andrew "original =" Cine ești? sub! / Cine sunt /, "Și" original # => "Și tu?"

Pe lângă aceste exemple simple, puteți face lucruri mai complexe, cum ar fi:

"1234567890" .sub / (\ d 3) (\ d 3) (\ d 4) / "

Nu ajungem MatchData obiecte sau variabilele globale cu metodele de substituire; cu toate acestea, putem folosi "backslash-number"? model în șirul de înlocuire, dacă îl împachetăm în citate simple. Dacă doriți să manipulați în continuare șirul capturat, puteți trece un bloc în loc de al doilea parametru:

"Ce se întâmplă?" "Gsub (/ \ S * /) | s | s.downcase # => "ce se întâmplă?"

Există multe alte funcții care utilizează expresii regulate; dacă sunteți interesat, ar trebui să verificați String # scanare și Șirul # divizat, pentru început.


Concluzie

Vom face expresii regulate în Ruby pentru tine. Dacă aveți întrebări, să le auzim în comentarii.

Cod