Expresie uzuala

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

O expresie regulată (în limba engleză expresie regulată sau, sub formă prescurtată, regexp, regex sau RE) este o secvență de simboluri (deci un șir de caractere ) care identifică un set de șiruri. Ele pot defini toate și numai limbile obișnuite . Teorema lui Kleene afirmă că clasa de limbi regulate corespunde clasei de limbi generate de tip 3 gramatici (în ierarhia Chomsky ) și recunoscute de automate de stare finită . Cu toate acestea, în practică , există anumite constructe (de exemplu backreference constructelor) [1] , care permit să se extindă setul de limbi definibile. Diferite programe sprijină notatii diferite pentru a exprima aceleași expresii regulate, astfel încât nu există nici un „universal“ sintaxă .

Istorie

Deși au fost formalizate deja în 1940 , expresii regulate a intrat în lumea computerelor , pentru prima dată la sfârșitul anilor 1960 , în Unix mediu: primul editor de text care functii implementate care au permis utilizarea lor a fost o versiune de QED scris de Ken Thompson , unul dintre pionierii Unix. Editorul, de la ei interfață linie de comandă , pus la dispoziție o comandă de imprimare numit la nivel mondial expresie regulată, care ulterior a fost făcută o cerere independentă, grep .

Expresiile regulate nu au avut o mare difuzie și utilizarea până în anii optzeci , când Perl limbajul de programare a fost inventat , care a permis utilizarea de nativ expresii regulate. Versatilitatea limbii, de asemenea , datorită faptului de a fi un limbaj interpretat , a permis utilizarea acestuia în diferite situații și au favorizat dezvoltarea formalismului Perl pentru expresii regulate, care a devenit un standard de facto . Utilizarea pe scară largă a acestor instrumente a determinat dezvoltatorii să pună în aplicare expresii regulate în alte limbi , precum și, prin intermediul bibliotecilor , cum ar fi PCRE sau chiar ca o parte din bibliotecile standard ale unor limbi, cum ar fi Java și TCL .

Descriere

O expresie regulată definește o funcție care are un șir de caractere ca intrare și returnează o valoare de tip da / nu, în funcție de faptul dacă șirul urmează un anumit tipar sau nu.

De exemplu, toate adresele de e-mail trebuie să se facă după cum urmează: începe cu o secvență de caractere alfanumerice, urmat de la semn, urmat de alte caractere alfanumerice, urmat de o perioadă, urmat de două sau trei litere. [2] Această regulă informală ar deveni regexp în cazul în care au fost codificate în conformitate cu o sintaxă foarte precis recunoscut de un program capabil de interpretare siruri de caractere.

Expresiile regulate în limbile oficiale

Expresiile regulate sunt compuse din constante și operatori care seturi de denote siruri de caractere, și a operațiunilor între aceste seturi.

Având în vedere un alfabet finit , Următoarele constante sunt definite:

  1. sau ( Set gol )
  2. (string gol, adică șir de lungime 0)
  3. (caracter, )

și următoarele operațiuni:

  1. concatenare: RS o indică întregul din
  2. Uniune: indică unirea dintre cele două seturi
  3. Kleene stele : indică setul care conține toate posibilele iterații care pot fi obținute din elementele R.
  4. intersecție: indică intersecția dintre cele două seturi de șiruri
  5. completează: complementaritatea R indică setul de siruri de caractere care aparțin

De exemplu, datele Și din , din Și

Deci, putem spune că o expresie regulată, definită pornind de la un alfabet și un set de simboluri din , Este un șir de caractere din ceea ce face ca oricare dintre următoarele adevărate:

  1. sau sau , Unde S și T sunt expresii regulate pe alfabetul

Utilizarea expresiilor regulate

Expresiile regulate sunt utilizate în principal de către editori de text pentru găsirea și înlocuirea porțiuni de text. Ele sunt , de asemenea , de o mare importanță în informatică teoretică, în care, de exemplu, acestea sunt folosite pentru a reprezenta toate căile posibile pe un grafic . Cu toate acestea, expresii regulate sunt potrivite pentru a reprezenta un set foarte restrâns de limbi oficiale (în cazul în care ne-am dorit să reprezinte expresii sau limbaje de programare aritmetică, deja am avea nevoie de tipul de utilizare 2 limbi): utilizarea limbilor regulate este încă convenabil , ca inchizandu - le la operațiunile de unire, intersecție și complementarea, permite construirea unei algebrei booleene și o bună capacitate de luare a deciziilor.

Sintaxă

Tradițională UNIX expresii regulate

Sintaxa expresiilor regulate în UNIX conform POSIX standardului există în două versiuni diferite:

  • sintaxa numita bază, este cel care a fost creat pentru prima dată și este cea mai răspândită, un exemplu al unei aplicații care folosește este ed ;
  • sintaxa numita noua, care este cel care a fost definit cu standardul POSIX.2, este utilizat , de exemplu , prin egrep .

Când a fost propus noua versiune a sintaxei de expresie regulată, sa decis să facă vechea versiune învechită, doar de acum difuzarea versiunii vechi a fost de așa natură încât schimbarea nu a fost profitabilă [3] . Cele mai multe programe care utilizează regexps, cum ar fi grep și sed , folosesc aceste reguli de bază oferind în același timp sprijin pentru noile norme extinse. În această sintaxă, cele mai multe caractere sunt văzute ca literal, și ei se găsesc numai. De exemplu: „o“ găsește „o“; "Bc)" găsește "bc"); etc. Excepțiile de la această regulă sunt metacaractere :

. Găsiți un singur caracter (dacă acesta este în modul linie unică în caz contrar , dacă acesta este în multilinie este nevoie de toate celelalte decât \ n, adică un cărucior de întoarcere de caractere).
[] Găsiți un singur caracter conținut în paranteze. De exemplu, [abc] chibrituri fie un "a", "b" sau "c". [Az] este un domeniu și se potrivește cu fiecare literă mică a alfabetului. Pot exista cazuri mixte: [abcq-z] constată a, b, c, q, r, s, t, u, v, w, x, y, z, exact ca [a-cq-z].

„-“ pentru caracterul este literal numai în cazul în care este primul sau ultimul caracter din paranteze: [ABC-] sau [-abc]. Pentru a găsi o „[“ sau „]“ caracter, cel mai simplu mod este de a le pune mai întâi în interiorul paranteze: [] [ab] meciurile „]“, „[“, „a“ sau „b“.

[^] Găsiți orice caracter care nu sunt incluse în paranteze. De exemplu, [^ abc] se potrivește cu orice alta decât "a", "b" caracterul sau "c". [^ Az] găsește orice caracter unic, altul decât o literă mică. Ca mai sus, aceste două metode pot fi utilizate împreună.
^ Meciurile de la începutul șirului (sau fiecare linie a șirului, atunci când este utilizat în modul multilinie)
$ Se potrivește sfârșitul șirului sau poziția imediat precedentă un caracter newline (sau la sfârșitul fiecărei linii din șir, atunci când este utilizat în modul multilinie)
() Definește un „subexpression marcate“. Rezultatul a ceea ce este inclus în expresia poate fi amintit mai târziu. A se vedea mai jos, \ n.
\ n În cazul în care n este o cifră la 1 la 9; este ceea ce n - lea subexpression potrivire. Acest construct, numit backreference, extinde potențialul regexps dincolo de limbi regulate și nu a fost adoptată în sintaxa extinsă a regexps.
*
  • O expresie care constă dintr-un singur caracter, urmat de „*“ găsește la zero sau mai multe copii ale acestei expresii. De exemplu, "[xyz] *" găsește "", "x", "y", "zx", "zyx" și așa mai departe.
  • \ N *, unde n este o cifră de la 1 la 9, se potrivește cu zero sau mai multe iterații ceea ce n - lea subexpression MATCHED. De exemplu, chibrituri "(a.) C \ 1 *" "abcab" și "accac", dar nu "abcac".
  • O expresie închisă în „\ (“ și „\)“ urmat de „*“ nu este validă. În unele cazuri (de exemplu / usr / bin / xpg4 / grep din SunOS 5.8), se găsește zero sau mai multe repetiții ale șirului care expresia închisă găsite. In alte cazuri (de exemplu / usr / bin / grep din SunOS 5.8), se găsește ce a găsit expresia închisă, urmat de un literal "*".
{X, y} Găsiți ultimul „bloc“ , cel puțin x ori și nu mai mult de ori y. De exemplu, "un {3,5}" meciuri "aaa", "aaa" sau "aaaaa".

Versiunile mai vechi de grep nu acceptă alternativ „|“ separator.

Exemple:

„.atto“ se potrivește cu orice șir de cinci caractere , cum ar fi pisica, nebun, sau pact
„[GM] fapta“ își găsește și pisica nebun
„[^ P] fapta“ găsește toate combinațiile expresiei „.act“ cu excepția legământului
„^ [GM] fapta“ găsește pisică și prost , dar numai la începutul unei linii
„[GM] acționează $“ găsește pisică și se împerechează , dar numai la sfârșitul unei linii

Deoarece multe seturi de caractere variază în funcție de configurația locală (în unele cazuri , sunt organizate literele din abc..xyzABC ... XYZ, în altele aAbB..yYzZ), standardul POSIX a definit anumite clase sau categorii de caractere așa cum se arată în următorul tabel:

clasa POSIX sintaxa normală sens
[: Superior:] [AZ] majuscule
[: inferior:] [Az] litere mici
[: Alfa:] [A-Za-z] atât litere mari și litere mici
[: Alnum:] [A-Za-Z0-9] majuscule și litere mici și cifre
[: Cifră:] [0-9] numere
[: Xdigit:] [0-9A-Fa-f] numere în format hexazecimal
[: Punct:] [\ - „# $% &„() * +, \ /:;!.? <=> @ [\] \ ^ _` {|} ~ \\] semne de punctuatie
[: gol:] [\ T] spațiu sau TAB
[: Spațiu:] [\ T \ n \ r \ f \ v] caractere goale
[: Cntrl:] [\ X00- \ x1F \ x7F] caractere de control
[: grafic:] [^ \ T \ n \ r \ f \ v] caractere non-goale
[: imprimare:] [^ \ T \ n \ r \ f \ v] caractere și spații non-goale

paranteze pătrate fac parte din sintaxa pentru indicarea clasei de caractere. De exemplu [[: superior:] [: cifră:] ab] se potrivește cu orice literă mare, orice cifră, literă mică 'a' și litera 'b'.

Exemple de cuantificatori

  • * Caută apariția (zero sau mai multe ori) din următoarele caractere sau set de caractere:
abc* identificã ab urmat de zero sau mai multe c
ca în ab , abc , abcc , abccc
  • + Căutare pentru apariția (una sau mai multe ori) din următoarele caractere sau set de caractere:
ab[ce]+ identifică ab urmat de una sau mai multe c sau una sau mai multe e
ca în abc , abec , abccc , abcceeecccccce
  • ? Căutările pentru apariția (zero sau o dată) din caracterul următor sau set de caractere:
abc? identifică ab urmată sau nu de un c
ca în abc și ab
  • {m, n} Găsiți apariția (de ori om; m lăsat gol este zero, n gol stânga este infinit) a caracterului, setul de caractere sau sub- regex care urmează:
(ab){1,2} identifică secvențele de una sau două ab
ca în ab și abab

Notă

  1. ^ Backreference constructe în expresii regulate , pe technet.microsoft.com, Microsoft . Adus pe 9 septembrie 2014 .
  2. ^ De fapt , regula ar trebui să fie rafinat pentru a sprijini simbolurile non-alfanumerice care apar înainte și după , la semn, dar le neglija în acest exemplu simplu.
  3. ^ Regex - POSIX.2 expresii regulate , pe cl.cam.ac.uk. Adus la 17 ianuarie 2014 .

Bibliografie

Elemente conexe

Alte proiecte

linkuri externe

Controlul autorității LCCN (RO) sh2018002310 · GND (DE) 4506116-6 · BNF (FR) cb14626171d (data) · NDL (RO, JA) 01121341
Informatică Portal IT : accesați intrările Wikipedia care se ocupă cu IT