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.
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ă.
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
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.
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.
Vom face expresii regulate în Ruby pentru tine. Dacă aveți întrebări, să le auzim în comentarii.