În procesarea datelor , o expresie regulată sau o expresie regulată sau o expresie sau un model normal este un șir de caractere , care descrie, conform unei sintaxi precise, un set de șiruri de caractere posibile. Expresiile regulate sunt, de asemenea, numite regex (un cuvânt portmanteau format din expresia regulată engleză ). Expresiile regulate provin din teoriile matematice ale limbajelor formale din anii 1940. Capacitatea lor de a descrie concis seturi regulate explică de ce au fost găsite în mai multe domenii științifice în anii postbelici și justifică adoptarea lor în informatică . Expresiile regulate sunt folosite astăzi pentru a programa software cu funcționalități pentru citirea, controlul, modificarea și analiza textelor, precum și pentru manipularea limbajelor formale , cum ar fi limbajele computerizate .
Aceste expresii regulate au calitatea de a putea fi descrise prin formule sau tipare, (în modele englezești ) mult mai simple decât celelalte mijloace.
În anii 1940 , Warren McCulloch și Walter Pitts au descris sistemul nervos modelând neuronii prin simple automate. În 1956, logicianul Stephen Cole Kleene a descris apoi aceste modele în termeni de seturi regulate și automate . Este considerat a fi inventatorul expresiilor regulate. În 1959, Michael O. Rabin și Dana Scott au oferit primul tratament matematic și riguros al acestor concepte, care le-a adus premiul Turing în 1976.
În acest context, expresiile regulate corespund gramaticilor de tip 3 (vezi Gramatica formală ) din ierarhia Chomsky ; ele pot fi deci folosite pentru a descrie morfologia unei limbi .
Ken Thompson a implementat notația Kleene în editorul qed , apoi editorul ed în Unix și, în cele din urmă, în grep . De atunci, expresiile regulate au fost utilizate pe scară largă în utilități precum lex, precum și în limbaje de programare născute sub Unix, cum ar fi expr , awk , Perl , Tcl , Python etc.
Părăsind cadrul teoretic, expresiile regulate au dobândit funcționalități care permit descrierea limbajelor non-raționale. A avut loc astfel o schimbare semantică: noțiunea de expresie regulată nu are aceeași semnificație în contextul calculului aplicat și în teoria limbajelor formale.
Expresie uzuala | Cuvinte descrise | Cuvinte nedescrise |
---|---|---|
detectat | „Detectat” | „Detectat”, „detectat”, „detectat”, „„ |
ex- (a? e | æ | é) quo | „Ex-equo”, „ex-equo”, „ex-aequo” și „ex-æquo” |
„Ex-quo”, „ex-aiquo”, „ex-aeko”, „ex-æéquo” |
^ Secțiunea. + | „Secțiunea 1”, „Secțiunea 22”, „Secțiunea A”, ... |
„A se vedea secțiunea 1”, „ secțiunea ” |
6,66 USD * | „6.6”, „6.666”, „6.6666”, ... |
„6.66667”, |
[1234567890] + (, [1234567890] +)? | „2”, „42”, „0,618”, „49,3”, ... |
"3", ", 75", "" |
Creat inițial pentru a descrie limbajele formale, expresiile regulate sunt utilizate în analiza și manipularea limbajelor computerizate ; compilatorii și interpreții se bazează astfel pe aceștia.
Utilizată ca instrumentele de căutare a textului într-un document, o expresie regulată descrie șiruri de caractere cu proprietăți comune, pentru a le găsi într-un bloc de text pentru a aplica un tratament automat, cum ar fi adăugarea, înlocuirea, modificarea sau ștergerea acestora.
Mulți editori de text și cele mai integrate medii de dezvoltare acceptă expresii regulate. Un număr mare de utilități Unix știu cum să le folosească în mod nativ. Cele mai cunoscute sunt GNU grep sau GNU sed care, la fel ca editorii de text, folosesc aceste expresii pentru a naviga automat într-un document în căutarea unor bucăți de text compatibile cu modelul de căutare și, eventual, pentru a adăuga, substitui sau șterge.
La interfețele de linie de comandă (sau cojile ) utilizează un sistem legat , dar separat și mai puțin expresivă numită glob (ro) sau expandarea.
Expresiile regulate sunt frecvent utilizate în administrarea de sistem , dezvoltarea de software și activitățile de procesare a limbajului natural . Au văzut un nou domeniu de aplicație odată cu dezvoltarea internetului și diseminarea codului rău intenționat sau a mesajelor spam . Dintre filtre și roboți care utilizează aceste expresii sunt folosiți pentru a detecta elemente potențial dăunătoare.
În teoria limbajului formal , o expresie regulată este o expresie care reprezintă un limbaj rațional . În acest context, expresiile regulate au o putere expresivă mai limitată: această noțiune are un sens mai larg în calculul aplicat decât în teoria limbajului formal.
O expresie regulată este o serie de caractere tipografice (care se numește mai simplu „model” - „ model ” în engleză) care descriu un set de șiruri de caractere . De exemplu, setul de cuvinte „legat, legat, legat și legat” poate fi condensat într-un singur model „ex- (a? E | æ | é) quo”. Mecanismele de bază pentru formarea unor astfel de expresii se bazează pe caractere speciale de substituție, grupare și cuantificare.
O bară verticală separă de obicei două expresii alternative: „equo | aequo” desemnează fie equo, fie aequo. De asemenea, este posibil să utilizați paranteze pentru a defini câmpul și prioritatea detecției, "(ae | e) quo" desemnând același set ca "aequo | equo" și pentru a cuantifica grupurile prezente în model prin adăugarea de caractere de cuantificare la dreptul acestor grupări.
Cele mai frecvente cuantificatoare sunt:
Simbolurile cu o anumită semantică pot fi numite „operatori”, „metacaractere” sau „caractere speciale”. Personajele care se reprezintă doar pe sine sunt numite „literale”.
Expresiile regulate pot fi combinate, de exemplu prin concatenare , pentru a produce expresii regulate mai complexe.
Când un șir de caractere se potrivește cu descrierea dată de expresia regulată, spunem că există o „potrivire” între șir și tipar sau că tiparul „se potrivește” cu șirul. Această corespondență poate viza tot sau o parte din șirul de caractere. De exemplu, în propoziția „Cele două echipe au terminat la egalitate și s-au salutat. ", Șirul" ex-æquo "se potrivește cu modelul" ex- (a? E | æ | é) quo ".
În mod implicit, expresiile regulate sunt sensibile la majuscule și minuscule . Când este posibil, încearcă să se potrivească cu cel mai mare subșir corespunzător modelului: se spune că sunt „lacomi”. De exemplu, Aa+recunoaște întregul șir „Aaaaaaa” mai degrabă decât o parte „Aaa” (lacomie), dar nu recunoaște șirul „aaaA” (sensibilitate la majuscule).
Operatori | Descriere | Exemple | ||
---|---|---|---|---|
Expresie uzuala | Lanțuri descrise | Canalele nu sunt descrise | ||
expr 1 expr 2 | Operator de concatenare a două expresii (implicit). | ab | „Ab” | „A”, „b”, șir gol |
. | Un personaj și unul | . | „A”, „b” etc. | șir gol, „ab” |
expr ? | Acest cuantificator corespunde cu ceea ce îl precedă, prezent zero sau o dată . Dacă există mai multe potriviri într-un text, acesta le găsește mai întâi pe cele plasate în capul textului și apoi returnează cea mai mare lungime posibilă din acea poziție inițială. | la? | șir gol, „a” | „Aa”, „b” |
expr + | Acest cuantificator corespunde cu ceea ce îl precede, repetat de una sau de mai multe ori . Dacă există mai multe potriviri într-un text, acesta le găsește mai întâi pe cele plasate în capul textului și apoi returnează cea mai mare lungime posibilă din acea poziție inițială. | a + | „A”, „aa”, „aaaaa” etc. | șir gol, "b", "aaab" |
expr * | Acest cuantificator corespunde cu ceea ce îl precede, repetat zero sau de mai multe ori . Dacă există mai multe potriviri într-un text, acesta le găsește mai întâi pe cele plasate în capul textului și apoi returnează cea mai mare lungime posibilă din acea poziție inițială. | la* | șir gol, „a”, „aaa” și așa mai departe. | „B”, „aaab” |
expr 1 | expr 2 | Este operatorul de alegere între mai multe alternative, adică uniunea stabilită. Poate fi combinat de câte ori este necesar pentru fiecare dintre alternativele posibile. Se potrivește cu una dintre expresiile plasate înainte sau după operator . Aceste expresii pot fi opțional goale și, astfel, (x |) este echivalent cu x? | a | b | „A”, „b” | șir gol, "ab", "c" |
[ listă ] | Unul dintre caracterele dintre paranteze drepte („clasa de caractere”) | [a e i o u] | „A”, „e”, „i” etc. | șir gol, "b", "ae" |
[^ listă ] | Un caracter care nu este între paranteze pătrate („clasă de caractere”) | [^ aeiou] | „B” etc. | șir gol, "a", "bc" |
( expr ) | Gruparea expresiei între paranteze | (detectat) | „Detectat” | „Detectat”, „detectat”, „detectat” |
expr { n } | Exact n apariții ale expresiei care precede parantezele | un {3} | „Aaa” | „Aa”, „aaaa” |
expr { n , m } | Între n și m apariții ale expresiei care precede parantezele | un {2.4} | „Aa”, „aaa”, „aaaa” | „A”, „aaaaa” |
expr { n ,} | Cel puțin n apariții ale expresiei care precede parantezele | un {3,} | „Aaa”, „aaaa”, „aaaaa” etc. | „Aa” |
^ | Acest predicat nu corespunde niciunui caracter, dar remediază o condiție necesară care să permită găsirea unui acord cu privire la ceea ce îl urmează, indicând că trebuie să fie la începutul unei linii (astfel să fie la începutul textului de intrare sau după o întrerupere de linie) . Nu poate fi considerat așa la începutul expresiei regulate, în altă parte este considerat literal. Se aplică ca o condiție pentru restul expresiei regulate (și, prin urmare, privește toate alternativele reprezentate). | ^ a găsește „a” la începutul liniei, dar nu în „ba”. | ||
$ | Acest predicat nu se potrivește cu niciun caracter, dar remediază o condiție necesară care să permită găsirea unui acord cu privire la ceea ce o precedă, indicând că trebuie să fie la sfârșitul unei linii (astfel să fie la sfârșitul textului de intrare sau chiar înainte de o întrerupere de linie) . Nu poate fi considerat așa la sfârșitul expresiei regulate, în altă parte este considerat literal. Se aplică ca o condiție pentru restul expresiei regulate (și, prin urmare, privește toate alternativele reprezentate). | a $ găsește „a” la sfârșitul liniei, dar nu în „ab”. |
În informatică, un instrument pentru manipularea expresiilor regulate se numește motor de expresie regulată sau motor de expresie regulată . Există standarde care să asigure coerența în utilizarea acestor instrumente.
Standardul POSIX oferă trei seturi de standarde:
Expresiile regulate în perl sunt, de asemenea, un standard de facto, datorită bogăției și puterii lor expresive. În timp ce își urmăresc propria dezvoltare, ele sunt, de exemplu, la originea bibliotecii PCRE . ECMAScript propune, de asemenea, în documentul Standard ECMA-262 un standard folosit de exemplu de JavaScript .
Notările sau semantica lor pot varia ușor de la un motor de expresie regulat la altul. Aceștia pot respecta parțial sau parțial aceste standarde sau pot oferi propriile caracteristici, cum ar fi GNU sau .NET Framework . Detaliile fiecăruia sunt discutate mai târziu în acest articol.
O clasă de caractere este un set de caractere. Poate fi definit în diferite moduri:
Se pot face uniuni ale claselor de caractere: [0-9ab]desemnează setul format din caracterele „0” până la „9” și literele „a” și „b”. Unele biblioteci vă permit, de asemenea, să intersectați clase de caractere.
Între paranteze pătrate, metacaracterele sunt interpretate literal: [.?*]desemnează setul alcătuit din personaje ". ","? "Și" * ".
Cele mai utilizate clase de caractere sunt în general furnizate cu motorul de expresie regulată. Un inventar al acestor clase este făcut în tabelul de mai jos.
Biblioteca POSIX definește clasele inițial pentru ASCII și apoi, prin extensie, pentru alte forme de codificare a caracterelor, în funcție de localizare .
În Unicode și limbi precum perl, seturile de caractere sunt definite prin noțiunea de proprietăți ale caracterelor. Acest lucru face posibilă desemnarea unui set de caractere în funcție de categoria lor (exemple: literă, punctuație de deschidere, punctuație de închidere, separator, caracter de control), în funcție de direcția de scriere (de exemplu de la stânga la dreapta sau de la dreapta la stânga), în funcție de alfabet (exemple: latină, chirilică, greacă, hiragana); conform alocării blocurilor, sau chiar conform acelorași principii ca clasele de caractere POSIX (pe acest subiect, citiți secțiunea Expresii regulate și Unicode ).
POSIX | Nu standard | perl, Python | Vim | Java | Unicode | ASCII | Descriere |
---|---|---|---|---|---|---|---|
\p{ASCII} | [\x00-\x7F] | Caractere ASCII | |||||
[:alnum:] | \p{Alnum} | A-Za-z0-9 | Personaje alfanumerice | ||||
[:word:] | \w | \w | \w | A-Za-z0-9_ | Caracterele alfanumerice și „_” | ||
\W | \W | \W | ^A-Za-z0-9_ | Personaje care nu alcătuiesc cuvinte | |||
[:alpha:] | \a | \p{Alpha} | \p{L} sau \p{Letter} | A-Za-z | Personaje alfabetice | ||
[:blank:] | \s | \p{Blank} | \t | Spațiu și filă | |||
\b | \< \> | \b | (?<=\W)(?=\w)|(?<=\w)(?=\W) | Începutul și sfârșitul pozițiilor cuvintelor | |||
\B | \B | (?<=\W)(?=\W)|(?<=\w)(?=\w) | Poziții care nu corespund unui început sau un sfârșit de cuvânt | ||||
[:cntrl:] | \p{Cntrl} | \p{Cc} sau \p{Control} | \x00-\x1F\x7F | Controlează personajele | |||
[:digit:] | \d | \d | \p{Digit} sau \d | \p{Nd} sau \p{Decimal_Digit_Number} | 0-9 | Cifre zecimale | |
\D | \D | \D | \P{Nd} sau \P{Decimal_Digit_Number} | ^0-9 | Altceva decât o zecimală | ||
[:graph:] | \p{Graph} | \x21-\x7E | Personaje vizibile | ||||
[:lower:] | \l | \p{Lower} | \p{Ll} sau \p{Lowercase_Letter} | a-z | Litere mici | ||
[:print:] | \p | \p{Print} | \x20-\x7E | Caracterele de imprimat | |||
[:punct:] | \p{Punct} | \p{P} sau \p{Punctuation} | ][!"#$%&'()*+,./:;<=>?@\^_`{|}~- | Caracterele de punctuație | |||
[:space:] | \s | \_s | \p{Space} sau \s | \p{Z} sau \p{Separator} | \t\r\n\v\f | Personaje spațiale | |
\S | \S | \S | \P{Z} sau \P{Separator} | ^ \t\r\n\v\f | Altceva decât un personaj spațial | ||
[:upper:] | \u | \p{Upper} | \p{Lu} sau \p{Uppercase_Letter} | A-Z | Litere mari | ||
[:xdigit:] | \x | \p{XDigit} | A-Fa-f0-9 | Cifre hexazecimale | |||
\A | Începutul șirului de caractere | ||||||
\Z | Sfârșitul șirului de caractere |
De exemplu, în standardul POSIX, se [[:upper:]ab]potrivește un caracter între setul format din litere mari și litere mici „a” și „b”. În standardul ASCII, această expresie regulată ar fi scrisă [A-Zab].
Noțiunea de clasă de echivalență nu trebuie confundată cu noțiunea de clasă de caractere.
De exemplu, în regiunea FR, clasa [= e =] grupează toate literele {e, é, è, ë, ê}.
Aceasta înseamnă că, atunci când sunt colaționate, literele {e, é, è, ë, ê} apar în același set de caractere, după d și înainte de f .
Majoritatea standardelor și motoarelor de expresie regulată oferă funcții avansate. In mod deosebit :
Notatiile folosite sunt foarte variabile. Acest capitol reunește, pe de o parte, notațiile specifice diferitelor implementări și, pe de altă parte, compania de standardizare.
Standardul POSIX a încercat să remedieze proliferarea sintaxei și funcționalității prin furnizarea unui standard de expresii regulate configurabile. Puteți obține o prezentare generală citind manualul pentru regexmulte dialecte Unix , inclusiv GNU / Linux . Cu toate acestea, chiar și acest standard nu include toate funcționalitățile adăugate la expresiile regulate Perl.
În cele din urmă, POSIX adaugă suport pentru platforme care utilizează un set de caractere care nu sunt bazate pe ASCII, în special EBCDIC și suport parțial de localizare pentru unele metacaractere.
Expresii regulate de bazăUtilitățile din lumea Unix, cum ar fi sed , GNU grep , ed sau vi, utilizează standardul BRE („ Basic Regular Expression ”) al POSIX în mod implicit . În el, parantezele, parantezele, simbolul „? „Și simbolul„ + ”nu sunt metacaractere: ele se reprezintă doar pe ele însele. Pentru a-și lua semantica de la metacaractere, trebuie să fie evadați de simbolul „\”.
Exemplu: expresia regulată se potrivește cu (ab.)+„(abc) +”, dar nu cu „abcabd”, pentru care este \(ab.\)\+potrivit.
Expresii regulate extinseExpresia regulată extinsă POSIX (ERE ) este adesea acceptată în utilitarele distribuțiilor Unix și GNU / Linux prin includerea steagului -E în invocarea în linie de comandă a acestor utilitare. Spre deosebire de expresiile regulate de bază, ele recunosc personajele văzute anterior ca metacaractere. Prin urmare, trebuie scăpate pentru a fi interpretate literal.
Majoritatea exemplelor date aici sunt expresii regulate extinse POSIX.
Secvențe de evadareCa personaje (, ), [, ], ., *, ?, +, ^, |, $, -și \sunt folosite ca simboluri speciale, acestea ar trebui să fie menționate în o secvență de evacuare în cazul în care literalmente sunt denota caracterul corespunzător. Acest lucru se face precedându-le cu o bară inversă \.
Extensii similare sunt utilizate în editorul emacs , care folosește un set diferit de comenzi față de standardul POSIX; dar folosește aceleași expresii regulate cu o notație extinsă. În expresii regulate extinse sunt acum , de asemenea , sprijinite în Vim , versiunea îmbunătățită a vi .
Operator extins (nu POSIX) | Descriere | Exemplu |
---|---|---|
\{m,n\} | În notația extinsă, aceasta creează un cuantificator mărginit personalizat, permițând m să se potrivească exact cu n apariții din cele de mai sus, unde m și n sunt două numere întregi astfel încât m < n . Oricare dintre cei doi parametri poate fi omis: dacă primul parametru m este omis, acesta implicit este 0; dacă al doilea parametru n este omis, dar virgula este prezentă, se consideră infinită; dacă al doilea parametru n este omis, precum și virgula de separare, acesta ia valoarea implicită egală cu primul parametru m . | Vezi exemplele de mai jos. |
\( \) | În notația extinsă, gruparea parantezelor (într-o secvență de evadare) este utilizată pentru a delimita un set de alternative sau orice subexpresie regulată (cu excepția condițiilor de început și sfârșit de linie) pentru a aplica un cuantificator. În plus, aceste paranteze delimitează un grup de captură numerotat care poate fi utilizat pentru substituții (apoi facem referire la grupurile capturate din lanțul de substituție cu unde n este numărul grupului de captare cuprins între 1 și 9, întregul lanț găsit fiind reprezentat de ). $n$& | Vezi exemplele de mai jos. |
În plus, se adaugă multe alte secvențe de evadare pentru a desemna clase de caractere predefinite. Ele sunt specifice fiecărui utilitar sau uneori variază în funcție de versiune sau platformă (totuși au fost stabile de mult timp în emacs, care a fost un precursor al acestor extensii, pe care alți autori le-au implementat parțial într-un mod limitat sau diferit).
Python folosește expresii regulate bazate pe expresii regulate POSIX, cu unele extensii sau diferențe.
Articolele compatibile POSIX sunt următoarele:
Secvența \bdesemnează caracterul backspace ( 0x08cu codificare compatibilă ASCII) atunci când este utilizat într-o clasă de caractere, iar granița unui cuvânt în caz contrar.
Sistemul de operare BSD folosește biblioteca regex scrisă de Henry Spencer . Compatibil cu standardul POSIX 1003.2, această bibliotecă este utilizată și de MySQL (cu operatorii REGEXP și NU REGEXP) și PostgreSQL (cu operatorul „~” și variantele sale).
Motorul de expresie regulat al limbajului Tcl provine din evoluțiile lui Henry Spencer după cele ale bibliotecii BSD. Expresiile regulate se numesc expresii regulate avansate (sau ARE) și sunt ușor diferite de expresiile regulate extinse din POSIX. De asemenea, sunt acceptate expresiile regulate de bază și extinse.
Spre deosebire de alte motoare, acesta funcționează pe bază de PLC, ceea ce îl face mai puțin eficient atunci când sunt necesare capturi sau backtracking , dar mai eficient în caz contrar.
Perl oferă un set deosebit de bogat de extensii. Acest limbaj de programare are un mare succes datorită prezenței operatorilor de expresie regulată incluși în limbajul propriu-zis. Extensiile pe care le oferă sunt disponibile și pentru alte programe sub numele lib PCRE ( Perl-Compatible Regular Expressions , literalmente bibliotecă de expresii regulate compatibile cu Perl ). Această bibliotecă a fost scrisă inițial pentru serverul de poștă Exim , dar acum este preluată de alte proiecte precum Python , Apache , Postfix , KDE , Analog , PHP și Ferite .
Specificațiile Perl 6 regularizează și extind mecanismul sistemului de expresie regulată. Mai mult, este mai bine integrat în limbaj decât în Perl 5. Controlul randamentului pe urmele este foarte bun acolo. Sistemul regex al lui Perl 6 este suficient de puternic pentru a scrie parsere fără a utiliza pluginuri de parser . Expresiile regulate sunt o formă de subrutine, iar gramaticile sunt o formă de clasă . Mecanismul este implementat în ansamblul Parrot de către modulul PGE în implementarea Parrot a Perl 6 și în Haskell în implementarea Pugs . Aceste implementări sunt un pas important în construirea unui compilator Perl 6 complet. Unele dintre caracteristicile regexp-ului Perl 6, cum ar fi capturile numite, sunt încorporate de la Perl 5.10.
PHP acceptă două forme de notații: sintaxa POSIX (POSIX 1003.2) și cea, mult mai bogată și mai eficientă, a bibliotecii PCRE (Perl Compatible Regular Expression).
Una dintre defecțiunile criticate în PHP este legată de suportul limitat pentru șirurile de caractere, chiar dacă este utilizat în principal pentru procesarea textului, deoarece textul poate fi reprezentat doar într-un set de caractere codate pe 8 biți, fără a putea specifica clar care se folosește codarea. În practică, prin urmare, este necesar să adăugați la bibliotecile de suport PHP pentru codificarea și decodarea textelor, chiar dacă doar pentru a le reprezenta în UTF-8. Cu toate acestea, chiar și în UTF-8, problema apare imediat cu semantica expresiilor regulate, deoarece caracterele au o codificare cu lungime variabilă, ceea ce necesită o expresie regulată mai complexă. Extensiile PHP opționale sunt, prin urmare, dezvoltate pentru a crea un nou tip de date pentru text, pentru a facilita prelucrarea acestuia (și în cele din urmă să fie compatibile cu Perl6 care, la fel ca Haskell , va avea nativ suport Unicode complet).
ICU definește o bibliotecă portabilă pentru procesarea internațională de text. Aceasta este dezvoltată mai întâi în limbajul C (versiunea numită ICU4C) sau pentru platforma Java (versiunea numită ICU4J). Porturile (sau adaptările) sunt, de asemenea, disponibile în multe alte limbi, utilizând biblioteca dezvoltată pentru limbajul C (sau C ++ ).
Expresiile regulate care pot fi utilizate în ICU iau caracteristicile expresiilor regulate în Perl, dar le completează pentru a le oferi suport complet pentru setul de caractere Unicode (a se vedea secțiunea următoare pentru întrebări legate de standardizarea încă în curs). De asemenea, își clarifică semnificația făcând expresii regulate independente de setul de caractere codificat utilizat în documente, deoarece setul de caractere Unicode este utilizat ca codificare internă pivot.
Acest lucru se datorează faptului că expresiile regulate Perl (sau PCRE) nu sunt portabile pentru prelucrarea documentelor folosind seturi de caractere codate diferite și nici nu acceptă în mod corespunzător seturi de caractere codificate multibyte (cu lungime variabilă) precum ISO 2022 , Shift-JIS sau UTF-8 ) , sau codificate pe una sau mai multe unități binare de mai mult de 8 biți (de exemplu UTF-16 ), deoarece codificarea efectivă a acestor seturi ca secvențe de octeți depinde de platformă. -formă utilizată pentru procesare (ordinea de stocare a octeților într-un cuvânt de peste 8 biți).
ICU rezolvă acest lucru adoptând procesarea care utilizează intern un singur set de 32 de biți și acceptă setul complet de caractere universal (UCS), așa cum este definit în ISO / IEC 10646 și specificat semantic în standardul Unicode . (Care adaugă standardului suportul pentru proprietăți informative sau normative pe caractere și recomandări pentru prelucrarea automată a textului, unele dintre aceste recomandări fiind opționale sau informative, altele devenind standard și integrate în standardul Unicode însuși, altele au dobândit în cele din urmă statutul de standard internațional ISO sau standard național în anumite țări).
ICU acceptă următoarele extensii, direct în expresii regulate sau în expresia regulată a unei clase de caractere (între […]):
Expresiile regulate ICU sunt în prezent printre cele mai puternice și mai expresive în procesarea documentelor multilingve. Ele sunt în mare parte baza standardizării (încă în curs) a expresiilor regulate Unicode (a se vedea mai jos) și un subset este suportat în mod nativ în biblioteca de limbaj Java standard (care utilizează intern un set de caractere portabil la codificare variabilă, bazat pe UTF-16 cu extensii și ale căror unități de codificare sunt de 16 biți).
ICU este o bibliotecă în continuă evoluție. În principiu, ar trebui să adopte toate extensiile anunțate în Perl (inclusiv capturi numite), pentru a asigura interoperabilitatea cu Perl 5, Perl 6 și PCRE, precum și numărul tot mai mare de alte limbi care folosesc acest lucru. iar autorii ICU și Perl lucrează împreună pentru a defini o notație comună. Cu toate acestea, ICU adoptă în primul rând extensiile adoptate în expresiile regulate descrise în standardul Unicode, deoarece ICU servește ca referință principală în această anexă standard Unicode.
Cu toate acestea, nu există încă niciun standard sau standard tehnic care să abordeze unele aspecte importante ale expresiilor regulate într-un context multilingv, inclusiv:
Pentru a clarifica aceste din urmă aspecte lipsă, metacaractere suplimentare ar trebui să poată fi utilizate pentru a controla sau filtra evenimentele găsite, sau altfel o ordine standardizată impusă pe lista de apariții returnate. Prin urmare, autorii aplicației trebuie să fie vigilenți asupra acestor puncte și să se asigure că citesc toate aparițiile găsite și nu doar primele, pentru a putea decide care dintre apariții este cea mai potrivită pentru o operație dată.
Expresiile regulate au fost inițial folosite cu caractere ASCII . Multe motoare de expresie regulată pot gestiona acum Unicode . În multe feluri, setul de caractere codificat folosit nu are nicio diferență, dar apar unele probleme în extinderea expresiilor regulate pentru Unicode.
O întrebare este ce format de reprezentare Unicode intern este acceptat. Toate motoarele de expresie regulată din linia de comandă așteaptă UTF-8 , dar pentru biblioteci unii se așteaptă și la UTF-8, dar alții așteaptă doar un joc codat UCS-2 (sau chiar extensia sa UTF-16 care restricționează, de asemenea, secvențele valide) sau pe UCS- 4 doar (a se vedea restricția standardizată UTF-32 ).
O a doua întrebare este dacă întreaga gamă de valori a unei versiuni de Unicode este acceptată. Multe motoare acceptă doar planul de bază multilingv , adică caractere codabile pe 16 biți. Doar câteva motoare pot (din 2006) să gestioneze intervalele de valori Unicode pe 21 de biți.
O a treia întrebare este cum se extind constructele ASCII la Unicode.
Cu toate acestea, în practică, acest lucru nu este adesea cazul:
Un alt domeniu în care există variații este interpretarea indicatorilor de insensibilitate la caz.
Un alt răspuns la Unicode a fost introducerea claselor de caractere pentru blocurile Unicode și proprietățile generale ale caracterelor Unicode:
Note:
Există cel puțin trei familii de algoritmi care determină dacă un șir se potrivește cu o expresie regulată.
Cea mai veche abordare, numită explicită, se bazează pe traducerea expresiei regulate într-un automat finit determinist (DFA). Construcția unui astfel de automat pentru o expresie regulată a dimensiunii m are o complexitate în dimensiune și în memorie în O (2 m ), dar poate fi executată pe un șir de dimensiuni n într-un timp O (n) .
O abordare alternativă, numită implicită, constă în simularea unui automat finit nedeterminist prin construirea fiecărui AFD din mers și scăparea acestuia în pasul următor. Această abordare evită complexitatea exponențială a abordării anterioare, dar timpul de execuție crește în O (mn) . Acești algoritmi sunt rapizi, dar anumite funcționalități, cum ar fi recapturarea șirurilor de caractere și cuantificarea non-lacomă sunt dificil de implementat.
A treia abordare constă în compararea tiparului cu șirul de caractere prin separare și evaluare („ backtracking ”). Complexitatea sa algoritmică este exponențială în cel mai rău caz, de exemplu cu modele precum (a|aa)*b, dar oferă rezultate bune în practică. Este mai flexibil și permite o putere expresivă mai mare, de exemplu prin simplificarea recuceririi subșirurilor.
Unele implementări încearcă să combine calitățile diferitelor abordări, începând căutarea cu un AFD, apoi folosind separarea și evaluarea atunci când este necesar.