regex(7)

NUME
regex - expresii regulate POSIX.2

DESCRIERE
Expresiile regulate („ER”), astfel cum sunt definite în POSIX.2, se prezintă sub două forme: ER moderne (aproximativ cele din egrep(1); POSIX.2 le numește ER „extinse”) și ER depășite (aproximativ cele din ed(1); POSIX.2 ER „de bază”). ER învechite există mai ales pentru compatibilitatea retroactivă în unele programe vechi; acestea vor fi discutate la sfârșit. POSIX.2 lasă deschise unele aspecte ale sintaxei și semanticii ER; „(!)” marchează deciziile privind aceste aspecte care pot să nu fie complet portabile în alte implementări POSIX.2.

O ER (modernă) este una(!) sau mai multe(!) ramuri nevide, separate prin „|”. Se potrivește cu orice lucru care se potrivește cu una dintre ramuri.

O ramură este una(!) sau mai multe piese, concatenate. Ea corespunde unei potriviri pentru prima, urmată de o potrivire pentru a doua și așa mai departe.

O piesă este un atom eventual urmat de un singur(!) „*”, „+”, „?”, sau delimitattor. Un atom urmat de „*” corespunde unei secvențe de 0 sau mai multe potriviri ale atomului. Un atom urmat de „+” corespunde unei secvențe de 1 sau mai multe potriviri ale atomului. Un atom urmat de „?” corespunde unei secvențe de 0 sau 1 potriviri ale atomului.

Un delimitator este „{” urmată de un număr întreg zecimal fără semn, eventual urmată de „,” eventual urmată de un alt număr întreg zecimal fără semn, întotdeauna urmată de „}”. Numerele întregi trebuie să fie între 0 și RE_DUP_MAX (255(!)) inclusiv, iar dacă sunt două, primul nu poate depăși pe al doilea. Un atom urmat de un delimitator care conține un întreg i și nicio virgulă se potrivește cu o secvență de exact i potriviri ale atomului. Un atom urmat de un delimitator care conține un întreg i și o virgulă se potrivește cu o secvență de i sau mai multe potriviri ale atomului. Un atom urmat de un delimitator care conține două numere întregi i și j se potrivește cu o secvență de potriviri i până la j (inclusiv) ale atomului.

Un atom este o expresie regulată inclusă între „()” (care corespunde unei potriviri pentru expresia regulată), un set gol de „()” (care corespunde șirului nul)(!), o expresie între paranteze drepte (a se vedea mai jos), „.” (se potrivește cu orice caracter unic), „^” (se potrivește cu șirul nul de la începutul unei linii), „$” (se potrivește cu șirul nul de la sfârșitul unei linii), o bară oblică inversă „\” urmată de unul dintre caracterele „^. [$()|*+?{\” (se potrivește cu acest caracter luat ca un caracter obișnuit), o bară oblică inversă „\” urmată de orice alt caracter(!) (se potrivește cu acest caracter luat ca un caracter obișnuit, ca și cum „\” nu ar fi fost prezentă(!)), sau un singur caracter fără altă semnificație (se potrivește cu acest caracter). O acoladă „{” urmată de un alt caracter decât o cifră este un caracter obișnuit, nu începutul unui delimitator(!). Este ilegal să se încheie o ER cu „\”.

O expresie între paranteze drepte este o listă de caractere incluse între „[]”. În mod normal, se potrivește cu orice singur caracter din listă (a se vedea mai jos). Dacă lista începe cu un accent circumflex „^”, se potrivește cu orice caracter unic (a se vedea mai jos), dar nu din restul listei. Dacă două caractere din listă sunt separate prin „-”, aceasta este o abreviere pentru întregul interval de caractere dintre cele două (inclusiv) din secvența de colaționare, de exemplu, „[0-9]” în ASCII corespunde oricărei cifre zecimale. Este ilegal(!) ca două intervale să împartă un punct final, de exemplu, „a-c-e”. Intervalele depind foarte mult de secvența de colaționare, iar programele portabile ar trebui să evite să se bazeze pe ele.

Pentru a include un „]” literal în listă, faceți-l primul caracter (după un posibil „^”). Pentru a include un „-” literal, acesta trebuie să fie primul sau ultimul caracter, sau al doilea punct final al unui interval. Pentru a utiliza un literal „-” ca prim punct final al unui interval, includeți-l în „[.” și „.]” pentru a-l transforma într-un element de colaj (a se vedea mai jos). Cu excepția acestora și a unor combinații care utilizează „[” (a se vedea paragrafele următoare), toate celelalte caractere speciale, inclusiv „\”, își pierd semnificația specială în cadrul unei expresii între paranteze.

În cadrul unei expresii între paranteze drepte, un element de colaționare (un caracter, o secvență de mai multe caractere care se colaționează ca și cum ar fi un singur caracter sau un nume de secvență de colaționare pentru oricare dintre acestea) inclus între „[.” și „.]” reprezintă secvența de caractere a acelui element de colaționare. Secvența este un singur element al listei expresiei între paranteze drepte. O expresie între paranteze drepte care conține un element de colaționare cu mai multe caractere poate corespunde astfel mai multor caractere, de exemplu, dacă secvența de colaționare include un element de colaționare „ch”, atunci ER „[[.ch.]]*c” corespunde primelor cinci caractere din „chchcc”.

În cadrul unei expresii între paranteze drepte, un element de colaționare încadrat între „[=” și „=]” este o clasă de echivalență, reprezentând secvențele de caractere ale tuturor elementelor de colaționare echivalente cu acesta, inclusiv el însuși; (în cazul în care nu există alte elemente echivalente, tratamentul este ca și cum delimitatorii care le înconjoară ar fi „[.” și „.]”). De exemplu, dacă „o” și „ô)” sunt membrii unei clase de echivalență, atunci „[[=o=]]”, „[[=ô=]]” și „[oô]” sunt toate sinonime. O clasă de echivalență nu poate(!) fi un capăt al unui interval.

În cadrul unei expresii între paranteze drepte, numele unei clase de caractere încadrat în „[:” și „:]” reprezintă lista tuturor caracterelor care aparțin clasei respective. Numele standard ale claselor de caractere sunt:

    alnum | digit | punct
    alpha | graph | space
    blank | lower | upper
    cntrl | print | xdigit

Acestea reprezintă clasele de caractere definite în wctype(3). O configurație regională poate furniza altele. O clasă de caractere nu poate fi utilizată ca punct final al unui interval.

În cazul în care o ER ar putea corespunde mai multor subșiruri dintr-un șir dat, ER corespunde celui care începe cel mai întâi în șir. În cazul în care ER se poate potrivi cu mai mult de un subșir care începe în acel punct, se potrivește cu cel mai lung. Subexpresiile se potrivesc, de asemenea, cu cele mai lungi subșiruri posibile, sub rezerva constrângerii ca întreaga potrivire să fie cât mai lungă posibil, subexpresiile care încep mai înainte în ER având prioritate față de cele care încep mai târziu. Rețineți că subexpresiile de nivel superior au astfel prioritate față de subexpresiile lor componente de nivel inferior.

Lungimile de potrivire se măsoară în caractere, nu în elemente de colaționare. Un șir nul este considerat mai lung decât nici o potrivire. De exemplu, „bb*” se potrivește cu cele trei caractere din mijloc din „abbbc”, „(wee|week)(knights|nights)” se potrivește cu toate cele zece caractere din „weeknights”, atunci când „(.*).*” se potrivește cu „abc”, subexpresia în paranteză se potrivește cu toate cele trei caractere, iar atunci când „(a*)*” se potrivește cu „bc”, atât ER întreagă cât și subexpresia în paranteză se potrivesc cu șirul nul.

Dacă este specificată potrivirea independentă de diferența dintre minuscule și majuscule, efectul este ca și cum toate diferențele dintre minuscule și majuscule ar fi dispărut din alfabet. Atunci când un caracter alfabetic există atât în minusculă cât și în majusculă apare ca un caracter obișnuit în afara unei expresii între paranteze, acesta este transformat efectiv într-o expresie între paranteze drepte care conține ambele cazuri, de exemplu, „x” devine „[xX]”. Atunci când apare în interiorul unei expresii între paranteze drepte, toate variantele sale (minusculă, majusculă) sunt adăugate la expresia între paranteze drepte, astfel încât, de exemplu, „[x]” devine „[xX]” și „[^x]” devine „[^xX]”.

Nu se impune nicio limită specială privind lungimea ER(!). Programele destinate să fie portabile nu ar trebui să utilizeze ER mai lungi de 256 de octeți, deoarece o implementare poate refuza să accepte astfel de ER și să rămână conformă cu POSIX.

Expresiile regulate învechite („de bază”) diferă în mai multe privințe. „|”, „+” și „?” sunt caractere obișnuite și nu există echivalent pentru funcționalitatea lor. Delimitatorii pentru limite sunt „\{” și „\}”, „{” și „}” fiind caractere obișnuite. Parantezele pentru subexpresiile imbricate sunt „\(” și „\)”, cu „(” și „)” fiind ele însele caractere obișnuite. „^” este un caracter obișnuit, cu excepția începutului ER sau(!) începutul unei subexpresii în paranteză, „$” este un caracter obișnuit, cu excepția sfârșitului ER sau(!) sfârșitul unei subexpresii în paranteză, iar „*” este un caracter obișnuit dacă apare la începutul ER sau la începutul unei subexpresii în paranteză (după un posibil „^” inițial).

În sfârșit, există un nou tip de atom, o referință înapoi: „\” urmat de o cifră zecimală diferită de zero d corespunde aceleiași secvențe de caractere corespunzătoare celei de-a d-a subexpresii puse între paranteze (numerotarea subexpresiilor se face după pozițiile parantezelor de deschidere, de la stânga la dreapta), astfel încât, de exemplu, „\([bc]\)\1 se potrivește cu „bb” sau „cc” dar nu cu „bc”.

ERORI
A avea două tipuri de ExpresiiRegulate este o greșeală.

Actuala specificație POSIX.2 spune că „)” este un caracter obișnuit în absența unui caracter „(” pereche; acesta a fost rezultatul neintenționat al unei erori de redactare, iar schimbarea este probabilă. Evitați să vă bazați pe aceasta.

Referințele înapoi sunt o greșeală îngrozitoare, punând probleme majore implementărilor eficiente. Ele sunt, de asemenea, definite oarecum vag („a\(\(b\)*\2\)*d” corespunde cu „abbbd”?). Evitați să le utilizați.

Specificația POSIX.2 privind potrivirea independentă de tipul caracterelor (majusculă/minusculă) este vagă. Definiția „prezența majusculei sau minusculei, implică prezența celeilalte” dată mai sus reprezintă consensul actual între cei ce implementează utilizarea expresiilor regulate cu privire la interpretarea corectă.

AUTOR
Această pagină a fost preluată din pachetul regex al lui Henry Spencer.

CONSULTAȚI ȘI
grep(1), regex(3)

POSIX.2, secțiunea 2.8 (Regular Expression Notation).

TRADUCERE
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 (https://www.gnu.org/licenses/gpl-3.0.html) sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.