Am explicat deja cum puteți utiliza clasele de caractere pentru a se potrivi un singur personaj din mai multe caractere posibile. Alternanța este similară. Puteți utiliza alternanța pentru a potrivi o singură expresie regulată din mai multe expresii regulate posibile.

tutorial

Dacă doriți să căutați textul literal pisică sau câine, separați ambele opțiuni cu o bară verticală sau un simbol pipă: pisică | câine. Dacă doriți mai multe opțiuni, pur și simplu extindeți lista: cat | câine | mouse | peşte .

Operatorul de alternanță are cea mai mică prioritate dintre toți operatorii regex. Adică, îi spune motorului regex să se potrivească fie cu totul în stânga barei verticale, fie cu totul în dreapta barei verticale. Dacă doriți să limitați acoperirea alternanței, trebuie să utilizați paranteze pentru grupare. Dacă dorim să îmbunătățim primul exemplu pentru a se potrivi doar cuvinte întregi, ar trebui să folosim \ b (pisică | câine) \ b. Acest lucru îi spune motorului regex să găsească o limită de cuvânt, apoi fie pisică sau câine, și apoi o altă limită de cuvânt. Dacă am fi omis parantezele, atunci motorul regex ar fi căutat o limită de cuvânt urmată de pisică sau câine urmată de o limită de cuvânt.

Amintiți-vă că motorul Regex este dornic

Am explicat deja că motorul regex este dornic. Oprește căutarea imediat ce găsește o potrivire validă. Consecința este că, în anumite situații, ordinea alternativelor contează. Să presupunem că doriți să utilizați o regex pentru a se potrivi cu o listă de nume de funcții într-un limbaj de programare: Get, GetValue, Set sau SetValue. Soluția evidentă este Get | GetValue | Set | SetValue. Să vedem cum funcționează acest lucru când șirul este SetValue .

Motorul regex pornește de la primul simbol din regex, G și de la primul caracter din șir, S. Meciul eșuează. Cu toate acestea, motorul regex a studiat întreaga expresie regulată înainte de a porni. Deci, știe că această expresie regulată folosește alternanța și că întreaga regex nu a eșuat încă. Deci, continuă cu a doua opțiune, fiind al doilea G din regex. Meciul eșuează din nou. Următorul simbol este primul S din regex. Meciul reușește, iar motorul continuă cu următorul caracter din șir, precum și cu următorul simbol din regex. Următorul simbol din regex este e după S care tocmai s-a potrivit. e meciuri e. Următorul simbol, t se potrivește cu t .

În acest moment, a treia opțiune din alternanță a fost potrivită cu succes. Deoarece motorul regex este dornic, consideră că întreaga alternanță a fost potrivită cu succes imediat ce una dintre opțiuni are. În acest exemplu, nu există alte jetoane în regex în afara alternanței, astfel încât întreaga regex s-a potrivit cu setare în SetValue .

Contrar a ceea ce intenționam, regexul nu se potrivea cu întregul șir. Există mai multe soluții. O opțiune este să țineți cont de faptul că motorul regex este dornic și să schimbați ordinea opțiunilor. Dacă folosim GetValue | Obțineți | SetValue | Set, SetValue este încercat înainte de Set, iar motorul se potrivește cu întregul șir. Am putea, de asemenea, să combinăm cele patru opțiuni în două și să folosim semnul întrebării pentru a face parte din ele opționale: Obțineți (valoare)? | Setați (valoare)? . Deoarece semnul întrebării este lacom, SetValue este încercat înainte de Set .

Cea mai bună opțiune este probabil să exprimăm faptul că vrem să potrivim doar cuvinte complete. Nu vrem să potrivim Set sau SetValue dacă șirul este SetValueFunction. Deci soluția este \ b (Get | GetValue | Set | SetValue) \ b sau \ b (Get (Value)? | Set (Value)?) \ B. Deoarece toate opțiunile au același scop, putem optimiza acest lucru în continuare pentru a \ b (Obține | Set) (Valoare)? \ b .

Text-Directed Engine returnează cea mai lungă potrivire

Alternanța este în care diferă motoarele direcționate spre regex și cele direcționate către text. Când un motor orientat text încearcă să obțină | GetValue | Set | SetValue pe SetValue, încearcă toate permutările regexului la începutul șirului. O face atât de eficient, fără niciun fel de backtracking. Se vede că regex-ul poate găsi o potrivire la începutul șirului și că textul potrivit poate fi Set sau SetValue. Deoarece motorul orientat spre text evaluează regexul în ansamblu, nu are niciun concept ca o alternativă să fie listată înainte de alta. Dar trebuie să facă o alegere cu privire la ce meci să revină. Întoarce întotdeauna cel mai lung meci, în acest caz SetValue .

POSIX necesită cea mai lungă potrivire

Standardul POSIX lasă la latitudinea implementării alegerea unui motor direcționat către text sau regex. Un BRE care include backreferences trebuie evaluat folosind un motor orientat spre regex. Dar un BRE fără backreferences sau un ERE poate fi evaluat folosind un motor orientat spre text. Dar standardul POSIX impune ca cea mai lungă potrivire să fie returnată, chiar și atunci când este utilizat un motor orientat pe regex. Un astfel de motor nu poate fi dornic. Trebuie să continue să încerce toate alternativele chiar și după ce se găsește un meci, pentru a-l găsi pe cel mai lung. Acest lucru poate duce la performanțe foarte slabe atunci când o regex conține mai multe cuantificatoare sau o combinație de cuantificatoare și alternanță, deoarece toate combinațiile trebuie încercate pentru a găsi cea mai lungă potrivire.

Aromele Tcl și GNU funcționează și în acest fel.

Fa o donatie

V-a salvat acest site doar o călătorie la librărie? Vă rugăm să faceți o donație pentru a sprijini acest site și veți obține o viață de acces fără reclame pe acest site!