Expresii obisnuite

Expresiile regulate sunt un limbaj formal  folosit în programele de calculator care lucrează cu text pentru a căuta și a manipula subșiruri în text , pe baza utilizării metacaracterelor ( caractere wildcard ) . Pentru a căuta, se folosește un șir de modele ( model englezesc , în rusă este adesea numit „șablon”, „mască”), format din caractere și metacaractere și care stabilește regula de căutare. Pentru manipulările cu text, este specificat suplimentar un șir de înlocuire, care poate conține și caractere speciale.   

Caracteristici

Expresiile regulate sunt folosite de unii editori de text și utilitare pentru căutarea și înlocuirea textului. De exemplu, folosind expresii regulate, puteți specifica modele care vă permit să:

Expresiile regulate vă permit, de asemenea, să specificați o căutare mult mai complexă sau să înlocuiți modele.

Rezultatul lucrului cu o expresie regulată poate fi:

Dacă o expresie regulată este folosită pentru a înlocui textul, atunci rezultatul lucrării va fi un șir de text nou, care este textul sursă, din care subșirurile găsite (potrivite cu modelul) sunt eliminate și șirurile de înlocuire sunt înlocuite (eventual modificat de grupuri de caractere reținute în timpul analizei din textul sursă) . Un caz special de modificare a textului este eliminarea tuturor aparițiilor modelului găsit - pentru care șirul de înlocuire este specificat gol.

Setul de utilitare (inclusiv editorul sed și filtrul grep ) livrat cu distribuțiile UNIX au fost printre primii care au popularizat expresiile regulate pentru procesarea de text. Multe limbaje de programare moderne au suport încorporat pentru expresiile regulate. Printre acestea se numără ActionScript , Perl , Java [1] , PHP , JavaScript , limbaje .NET Framework [2] , Python , Tcl , Ruby , Lua , Gambas , C++ ( 2011 standard ), Delphi , D , Haxe și altele.

Istorie

Originile expresiilor regulate se află în teoria automatelor , în teoria limbajelor formale și în clasificarea gramaticilor formale a lui Chomsky [3] .

Aceste domenii studiază modele de calcul (automat) și modalități de descriere și clasificare a limbajelor formale . În anii 1940 Warren McCulloch și Walter Pitts au descris un sistem neuronal folosind un automat simplu ca model pentru un neuron .

Matematicianul Stephen Kleene a descris mai târziu aceste modele folosind notația sa matematică numită „ multimi regulate ”.

Ken Thompson le-a integrat în editorul QED și apoi în editorul UNIX . De atunci, expresiile regulate au devenit utilizate pe scară largă în UNIX și utilități asemănătoare UNIX, cum ar fi expr , awk , Emacs , vi , lex și Perl .

Expresiile regulate în Perl și Tcl provin dintr-o implementare scrisă de Henry Spencer . Philip Hazel a dezvoltat biblioteca PCRE ( expresii regulate compatibile cu Perl )   , care este folosită în multe instrumente moderne, cum ar fi PHP și Apache .

În teoria limbajelor formale

Expresiile regulate constau din constante și operatori care definesc seturi de șiruri de caractere și, respectiv, seturi de operații asupra acestora. Sunt definite următoarele constante:

si urmatoarele operatiuni:

Expresiile regulate găsite în limbajele de programare moderne (în special PCRE ) au mai multă putere decât ceea ce se numesc expresii regulate în teoria limbajului formal; în special, au referințe în spate numerotate . Acest lucru le permite să analizeze șiruri descrise nu numai de gramaticile obișnuite, ci și de altele mai complexe, în special gramaticile fără context [5] [6] .

Sintaxă

Reprezentare simbol

Caractere obișnuite ( literale ) și caractere speciale ( metacaractere )

Majoritatea caracterelor dintr-o expresie regulată se reprezintă, cu excepția caracterelor speciale [ ] \ / ^ $ . | ? * + ( ) { } (acest set diferă pentru diferite tipuri de expresii regulate, vezi Varietăți de expresii regulate ), care pot fi eliminate cu un caracter \(backslash) pentru a se reprezenta ca caractere text. Puteți scăpa de o întreagă secvență de caractere prin includerea acesteia între \Qși \E.

Exemplu Conformitate
a\.? a.saua
a\\\\b a\\b
a\[F\] a[F]
\Q+-*/\E +-*/

Alte caractere speciale pot fi reprezentate în mod similar (seturile de caractere care necesită evadare pot varia în funcție de implementarea specifică). O parte din caracterele care într-o implementare sau alta nu necesită evadare (de exemplu, paranteze unghiulare < >) pot fi evadate din motive de lizibilitate.

Orice caracter

Metacaracterul .(punctul) înseamnă orice caracter unic, dar în unele implementări, excluzând caracterul newline.

În loc de un caracter ., puteți utiliza [\s\S](toate caracterele spații albe și care nu sunt, inclusiv caracterul nou-linie).

Clase de caractere (seturi de caractere)

Setul de caractere dintre paranteze pătrate [ ]se numește o clasă de caractere și vă permite să indicați interpretului de expresii regulate că unul dintre caracterele enumerate poate apărea într-un anumit loc într-un șir. În special, [абв]stabilește posibilitatea de apariție în text a unuia dintre cele trei caractere specificate și [1234567890]setează corespondența la una dintre cifre. Este posibil să specificați intervale de caractere: de exemplu, [А-Яа-я]se potrivește cu toate literele alfabetului rus, cu excepția literelor "Ё" și "ё" [7] . Unele implementări ale expresiilor regulate pot permite claselor de caractere să includă nu numai caractere, ci și șiruri întregi. [opt]

Dacă doriți să specificați caractere care nu sunt incluse în setul specificat, atunci utilizați caracterul ^din paranteze drepte, de exemplu, [^0-9]înseamnă orice caracter, altul decât numere.

Adăugarea de caractere speciale la set prin evadare este cea mai simplă modalitate. Cu toate acestea, expresiile regulate moderne moștenesc și abordarea tradițională - vezi Expresii regulate tradiționale .

Unele clase de caractere pot fi înlocuite cu metacaractere speciale:

Simbol Echivalent posibil [9] Conformitate
\d [0-9] Цифровой символ
\D [^0-9] Нецифровой символ
\s [ \f\n\r\t\v] Пробельный символ
\S [^ \f\n\r\t\v] Непробельный символ

Пример: Выражение вида ^\S.* или ^[^ \f\n\r\t\v].* будет находить строки, начинающиеся с непробельного символа

\w[10] [A-Za-z0-9_] Буквенный или цифровой символ или знак подчёркивания; буквы ограничены латиницей

Пример: Выражение вида \w+ будет находить и выделять отдельные слова

\W[11] [^A-Za-z0-9_] Любой символ, кроме буквенного или цифрового символа или знака подчёркивания

Poziție într-un șir

Următoarele caractere vă permit să poziționați expresia regulată în raport cu elementele textului: începutul și sfârșitul unei linii, limitele cuvintelor.

Performanţă Poziţie Exemplu Conformitate
^ Începutul textului (sau linie cu modificatorul ?m) ^a aaa aaa
$ Sfârșitul textului (sau rând cu modificatorul ?m) a$ aaa aaa
\b marginea cuvântului a\b aaa aaa
\ba aaa aaa
\B Nici o limită de cuvânt \Ba\B aaa aaa
\G Căutare anterioară cu succes \Ga aaa aaa(cautarea s-a oprit la pozitia a 4-a - unde nu a fost gasita a)

Caractere speciale

\n - line feed

\r - retur carucior

Desemnarea grupului

Parantezele sunt folosite pentru a defini domeniul și prioritatea operațiilor . Un model din cadrul unui grup este procesat ca un întreg și poate fi cuantificat. De exemplu, expresia (тр[ау]м-?)*va găsi o secvență de forma трам-трам-трумтрам-трум-трамтрум.

Enumerare

O bară verticală separă opțiunile valide. De exemplu, gray|greypotriviri graysau grey. Trebuie reținut că enumerarea opțiunilor se efectuează de la stânga la dreapta, așa cum sunt indicate.

Dacă doriți să specificați o listă de opțiuni într-o expresie regulată mai complexă, atunci aceasta trebuie inclusă într-un grup. De exemplu, gray|greysau gr(a|e)ydescrieți un șir graysau grey. În cazul alternativelor cu un singur caracter, opțiunea este preferată gr[ae]y, deoarece compararea cu o clasă de caractere este mai ușoară decât procesarea unui grup cu o verificare a tuturor modificatorilor posibili și generarea de feedback.

Cuantificare (căutare secvențe)

Cuantificatorul după un caracter, o clasă de caractere sau un grup determină de câte ori poate apărea expresia precedentă. Rețineți că un cuantificator se poate referi la mai mult de un caracter dintr-o expresie regulată numai dacă este o clasă sau un grup de caractere.

Performanţă Numărul de repetări Echivalent Exemplu Conformitate
? Zero sau unu {0,1} colou?r color,colour
* Zero sau mai mult {0,} colou*r color, colour, colouur etc.
+ Una sau mai multe {1,} colou+r colouretc. ( dar nu colouur )color
Performanţă Numărul de repetări Exemplu Conformitate
{n} Exact de n ori colou{3}r colouuur
{m,n} De la m la n inclusiv colou{2,4}r colouur. colouuur.colouuuur
{m,} Nu mai puțin de m colou{2,}r colouur, colouuur, colouuuur etc.
{,n} nu mai mult de n colou{,3}r color. colour. colouur.colouuur

O secvență este adesea folosită .*pentru a desemna orice număr de caractere între două părți ale unei expresii regulate.

Clasele de caractere în combinație cu cuantificatori vă permit să vă potriviți cu texte reale. De exemplu, coloane de numere, numere de telefon, adrese poștale, elemente de marcare HTML etc.

Dacă caracterele { } nu formează un cuantificator, semnificația lor specială este ignorată.

Cuantificare lacomă și leneșă Un exemplu de utilizare a expresiilor lacome și leneșe

Expresia se (<.*>)potrivește cu un șir care conține mai multe etichete de markup HTML în întregime.

<p><b>Википедия</b> — свободная энциклопедия, в которой <i>каждый</i> может изменить или дополнить любую статью.</p>

Pentru a evidenția etichetele individuale, puteți aplica o versiune leneșă a acestei expresii: (<.*?>) nu corespunde întregii linii afișate mai sus, ci etichetelor individuale (evidențiate în culoare):

<p><b>Википедия</b> — свободная энциклопедия, в которой <i>каждый</i> может изменить или дополнить любую статью.</p>

În unele implementări, cuantificatorii din expresiile regulate corespund celui mai lung șir posibil (cuantificatorii sunt greedy , engleză  greedy ). Aceasta poate fi o problemă semnificativă. De exemplu, se așteaptă adesea ca o expresie să găsească etichete HTML(<.*>) în text . Cu toate acestea, dacă există mai mult de o etichetă HTML în text, atunci întreaga linie care conține mai multe etichete se potrivește cu expresia.

<p><b>Википедия</b> — свободная энциклопедия, в которой <i>каждый</i> может изменить или дополнить любую статью.</p>

Această problemă poate fi rezolvată în două moduri.

  1. Luați în considerare caracterele care nu se potrivesc cu modelul dorit ( <[^>]*>pentru cazul de mai sus).
  2. Definiți un cuantificator ca non-lacom ( leneș , engleză  leneș ) - majoritatea implementărilor vă permit să faceți acest lucru adăugând un semn de întrebare după el.

Utilizarea cuantificatorilor leneși poate duce la problema inversă atunci când o expresie se potrivește prea scurtă, în special șirul gol.

Lacom Leneş
* *?
+ +?
{n,} {n,}?

De asemenea, o problemă comună atât cu expresiile lacome, cât și cu cele lene, sunt punctele de întoarcere pentru iterarea peste variantele unei expresii. Perioadele sunt plasate după fiecare iterație a cuantificatorului. Dacă interpretul nu găsește o potrivire după cuantificator, atunci începe să revină pentru toate punctele de referință, recalculând expresia de acolo într-un mod diferit.

Cuantificare geloasă (superlacom)

Când caută o expresie într-un șir, interpretul va merge aproximativ pe următoarea cale: (a+a+)+a aaaaa

  1. aaaaa
  2. aaaa
  3. aaaaa
  4. aaa
  5. aaaaa
  6. aaaa
  7. aaaaa- si abia atunci, dupa verificarea tuturor punctelor de retur, se va opri.

Când utilizați un cuantificator gelos, va fi executat doar primul pas al algoritmului.

Spre deosebire de cuantificarea obișnuită (lacomă), cuantificarea geloasă (posesivă) nu numai că încearcă să găsească cea mai lungă opțiune, dar nici nu permite algoritmului să revină la pașii anteriori de căutare pentru a găsi potriviri posibile pentru restul expresiei regulate.

Utilizarea cuantificatoarelor geloase crește viteza de căutare, mai ales în cazurile în care șirul nu se potrivește cu expresia regulată. În plus, cuantificatoarele geloase pot fi folosite pentru a elimina potrivirile nedorite.

Lacom Gelos
* *+
? ?+
+ ++
{n,} {n,}+
Exemplu Conformitate
ab(xa)*+a abxaabxaa; dar nu , deoarece scrisoarea este deja luată abxaabxaaa

Aceasta este analogă grupării atomice .

Grupare

Feedback

O utilizare a grupării este de a reutiliza grupurile de caractere găsite anterior ( subșiruri , blocuri , subexpresii marcate , capturi ). La procesarea expresiei, subșirurile găsite de model în cadrul grupului sunt stocate într-o zonă de memorie separată și primesc un număr începând de la unul. Fiecare subșir se potrivește cu o pereche de paranteze în expresia regulată. Cuantificarea grupului nu afectează rezultatul salvat, adică doar prima apariție este salvată. De obicei, sunt acceptate până la 9 subșiruri numerotate, numerotate de la 1 la 9, dar unii interpreți vă permit să lucrați cu mai multe. Ulterior, în cadrul acestei expresii regulate, notația de la \1la poate fi folosită \9pentru a verifica o potrivire cu un subșir găsit anterior.

De exemplu, expresia regulată se (та|ту)-\1va potrivi cu șirul та-таsau ту-ту, dar omite șirul та-ту.

De asemenea, subșirurile găsite anterior pot fi folosite atunci când sunt înlocuite cu expresii regulate. În acest caz, în textul de înlocuire sunt inserate aceleași simboluri ca și în expresia însăși.

Grupare fără feedback

Dacă grupul este folosit doar pentru grupare și rezultatul său nu este necesar mai târziu, atunci puteți utiliza gruparea de tip . O zonă de memorie separată nu este alocată pentru rezultatul unei astfel de grupări și, în consecință, nu i se atribuie un număr. Acest lucru are un efect pozitiv asupra vitezei de execuție a expresiei, dar reduce lizibilitatea. (?:шаблон)

Grupare atomică

O grupare atomică a unei vizualizări , ca o grupare fără feedback, nu creează feedback. În schimb, o astfel de grupare interzice trecerea înapoi prin șir dacă o parte a modelului a fost deja găsită. (?>шаблон)

Exemplu Conformitate Grupuri create
a(bc|b|x)cc abccaxcc

abccaxcc

abccaxcc

abccaxcc

a(?:bc|b|x)cc abccaxcc,abccaxcc Nu
a(?>bc|b|x)cc abccaxcc

dar nu abccaxcc: varianta xgasita, altele ignorate

Nu
a(?>x*)xa nu a fost găsit axxxa: toată lumea este xocupată și nu există întoarcere în interiorul grupului

Gruparea atomică este chiar mai rapidă decât gruparea în buclă deschisă și economisește timp CPU în timp ce se execută restul expresiei, deoarece împiedică verificarea oricăror alte opțiuni din grup atunci când o opțiune a fost deja găsită. Acest lucru este foarte util atunci când optimizați grupuri cu multe opțiuni diferite.

Acest lucru este analog cu cuantificarea geloasă .

Modificatori

Modificatorii sunt valabili din momentul apariției până la sfârșitul expresiei regulate sau al modificatorului opus. Unii interpreți pot aplica modificatorul întregii expresii, mai degrabă decât din momentul în care apare.

Sintaxă Descriere
(?i) Include insensibilitate la majuscule _  _
(?-i) Se oprește
(?s) Include modul de potrivire a punctelor pentru caracterele de avans de linie și de returnare a căruciorului
(?-s) Se oprește
(?m) Simboluri ^și $cauzează doar o potrivire după și înainte de caractere newline
(?-m) cu începutul și sfârșitul textului
(?x) Include modul fără a lua în considerare spațiile dintre părțile expresiei regulate și vă permite să utilizați #pentru comentarii
(?-x) Se oprește

Grupurile modificatoare pot fi combinate într-un singur grup: (?i-sm). Un astfel de grup activează și dezactivează imodurile sși m. Dacă utilizarea modificatorilor este necesară numai în cadrul unui grup, atunci modelul dorit este indicat în interiorul grupului după modificatori și după două puncte. De exemplu, (?-i)(?i:tv)setva găsi , TVsetdar nu TVSET.

Comentarii

Pentru a adăuga comentarii la o expresie regulată, puteți utiliza grupuri de comentarii din formularul . Un astfel de grup este complet ignorat de către interpret și nu este verificat pentru apariția în text. De exemplu, expresia se potrivește cu șirul . (?#комментарий)А(?#тут комментарий)БАБ

Privește înainte și înapoi

Majoritatea implementărilor de expresii regulate au o modalitate de a căuta o bucată de text „prinzând” (dar fără a include) textul din jur care vine înainte sau după fragmentul de text căutat. Căutarea negativă este folosită mai rar și „se asigură” că potrivirile specificate, dimpotrivă, nu apar înainte sau după fragmentul de text căutat.

Performanţă Tip de vizualizare Exemplu Conformitate
(?=шаблон) privire pozitivă înainte Людовик(?=XVI) ЛюдовикXV, ЛюдовикXVI, ЛюдовикXVIII, ЛюдовикLXVII, ЛюдовикXXL
(?!шаблон) Privire negativă înainte (cu negație) Людовик(?!XVI) ЛюдовикXV, ЛюдовикXVI, ЛюдовикXVIII, ЛюдовикLXVII, ЛюдовикXXL
(?<=шаблон) Privire pozitivă înapoi (?<=Сергей )Иванов Сергей Иванов, Игорь Иванов
(?<!шаблон) Privire în urmă negativă (cu negație) (?<!Сергей )Иванов Сергей Иванов, Игорь Иванов

Caută după condiție

În multe implementări ale expresiilor regulate, este posibil să alegeți ce cale va urma verificarea într-un loc sau altul în expresia regulată, pe baza valorilor deja găsite.

Performanţă Explicaţie Exemplu Conformitate
(?(?=если)то|иначе) Dacă operația de scanare are succes, atunci următoarea parte este executată то, în caz contrar, partea este executată иначе. Oricare dintre cele patru operații de căutare poate fi utilizată într-o expresie. Rețineți că operația de căutare are lățime zero, astfel încât părțile тоîn cazul unei căutări pozitive sau иначеîn cazul unei căutări negative trebuie să includă descrierea șablonului din operația de căutare. (?(?<=а)м|п) мам,пап
(?(n)то|иначе) Dacă al n -lea grup a returnat o valoare, atunci căutarea după condiție este efectuată de modelul то, în caz contrar de modelul иначе. (а)?(?(1)м|п) мам,пап

Steaguri

În unele limbi (de exemplu, în JavaScript ) așa-numitele. „steaguri” care extind funcționalitatea RegExp. Steagurile sunt specificate după expresia regulată (ordinea steagurilor nu contează). Steaguri tipice:

  • g  - căutare globală (se procesează toate potrivirile cu modelul de căutare);
  • i  - majusculele nu contează;
  • m  - căutare pe mai multe linii;
  • s  - textul este tratat ca o singură linie, în acest caz, metacaracterul .(punctul) se potrivește cu orice caracter, inclusiv caracterul newline;
  • u  - interpretare unicode. Expresia poate conține modele speciale specifice Unicode, cum ar fi /\p{Lu}/ majuscule.

Steagul este specificat după model, de exemplu, astfel: . /[0-9]$/m

Varietăți de expresii regulate

Expresii regulate POSIX de bază

( Expresii regulate de bază în engleză  (BRE)). Expresii regulate UNIX tradiționale . Sintaxa expresiei regulate de bază este acum depreciată de POSIX , dar este încă utilizată pe scară largă din motive de compatibilitate inversă. Multe utilitare UNIX folosesc astfel de expresii regulate în mod implicit.

Această versiune include metacaractere:

  • .;
  • [ ];
  • [^ ];
  • ^(valabil doar la începutul unei expresii);
  • $(valabil doar la sfârșitul expresiei);
  • *;
  • \{ \} - versiunea initiala pentru { };
  • \( \) - versiunea initiala pentru ( );
  • \n, unde n  este un număr de la 1 la 9.

Particularitati:

  • Asteriscul trebuie să apară după expresia care se potrivește cu un singur caracter. Exemplu: [xyz]*.
  • Expresia trebuie considerată nevalidă. În unele cazuri, se potrivește cu zero sau mai multe repetări ale șirului . În altele, se potrivește cu șirul .\(блок\)*блокблок*
  • În cadrul unei clase de caractere, valorile caracterelor speciale sunt în general ignorate. Cazuri speciale:
    • Pentru a adăuga un caracter ^la un set, acesta nu trebuie plasat acolo mai întâi.
    • Pentru a adăuga un caracter -la un set, acesta trebuie plasat acolo fie primul, fie ultimul. De exemplu:
      • Șablon de nume DNS, care poate include litere, cifre, minus și punct delimitator: [-0-9a-zA-Z.];
      • orice caracter cu excepția minusului și a numărului: [^-0-9].
    • Pentru a adăuga un simbol [sau ]la un set, acesta trebuie plasat mai întâi acolo. De exemplu:
      • [][ab]potriviri ], sau . [_ab

Expresii regulate POSIX extinse

( Expresii regulate extinse în engleză  (ERE)). Sintaxa este practic aceeași cu cea tradițională.

  • S-a eliminat utilizarea barelor oblice inverse pentru metacaractere { }și ( ).
  • O bară oblică inversă înaintea unui metacaracter își anulează semnificația specială (vezi Reprezentarea caracterelor speciale ).
  • Proiectul teoretic neregulat este respins .\n
  • Metacaractere adăugate +, ?, |.

Expresii regulate compatibile cu Perl

Expresiile regulate compatibile cu Perl (PCRE) au o sintaxă mai bogată chiar și POSIX ERE .  Din acest motiv, multe aplicații folosesc sintaxa expresiilor regulate compatibile cu Perl.

Expresii regulate compatibile cu Unicode

Unicode  este un set de caractere al cărui scop este de a defini toate caracterele și simbolurile din toate limbile umane, vii și morți. Expresiile regulate concepute pentru multe limbi nu sunt astfel legate de seturi de caractere specifice, ci le descriu conform regulilor acceptate. Deci, de exemplu, o expresie pentru găsirea literelor majuscule în orice alfabet ar arăta astfel: /\p{Lu}/.

Unele expresii regexp sunt unicode:
performanţă funcţionalitate
posibilă formă scurtă posibilă formă lungă
Scrisori
\p{L} \p{Letter} orice literă în orice limbă
\p{Ll} \p{Lowercase_Letter} litere mici (minuscule) ale celor care au ortografia mare
\p{Lu} \p{Uppercase_Letter} litere mari (majuscule) pentru cei cu o ortografie mică
\p{Lt} \p{Titlecase_Letter} o literă mare care apare la începutul unui cuvânt cu minuscule
\p{L&} \p{Cased_Letter} o literă care are atât ortografie majuscule, cât și minuscule
\p{Lm} \p{Modifier_Letter} caractere speciale care sunt folosite ca litere
\p{Lo} \p{Other_Letter} un caracter sau o ideogramă care nu are ortografii mari sau mici
Simboluri speciale
\p{M} \p{Mark} caractere inserate pentru a se combina cu alte caractere (de exemplu, accente, dieresale, paranteze de ambalare)
\p{Mn} \p{Non_Spacing_Mark} un caracter inserat pentru a fi combinat cu alte caractere fără a ocupa o lățime suplimentară
\p{Mc} \p{Spacing_Combining_Mark} caractere introduse pentru a fi combinate cu alte caractere, ocupând o lățime suplimentară (ca în multe limbi orientale)
\p{Me} \p{Enclosing_Mark} personaje care învelesc un personaj. De exemplu, cerc, pătrat etc.
Spații și separatoare
\p{Z} \p{Separator} orice fel de spatii sau separatoare invizibile
\p{Zs} \p{Space_Separator} caractere care sunt invizibile, dar au o lățime
\p{Zl} \p{Line_Separator} simbolul de separare a liniilor U+2028
\p{Zp} \p{Paragraph_Separator} marca paragrafului U+2029
Simboluri matematice
\p{S} \p{Symbol} simboluri matematice, simboluri valutare, simboluri pseudografice (cadre) etc.
\p{Sm} \p{Math_Symbol} orice simboluri matematice
\p{Sc} \p{Currency_Symbol} orice simbol valutar
\p{Sk} \p{Modifier_Symbol} caracter combinat (marca) ca o combinație a caracterului în sine și a caracterului marca
\p{So} \p{Other_Symbol} diferite simboluri, simboluri non-matematice, non-monede sau combinații ale acestora
Caractere numerice
\p{N} \p{Number} orice fel de caractere digitale în orice limbă
\p{Nd} \p{Decimal_Digit_Number} numere de la zero la nouă în orice limbă
\p{Nl} \p{Letter_Number} un număr care poate arăta ca litere, cum ar fi cifrele romane
\p{No} \p{Other_Number} un număr reprezentat ca superscript sau indice sau un număr care nu este format din cifre (cu excepția numerelor din scripturile ideografice)
Semne de punctuatie
\p{P} \p{Punctuation} orice fel de semne de punctuație
\p{Pd} \p{Dash_Punctuation} orice fel de cratimă sau liniuță
\p{Ps} \p{Open_Punctuation} orice fel de paranteze de deschidere
\p{Pe} \p{Close_Punctuation} orice fel de paranteze de închidere
\p{Pi} \p{Initial_Punctuation} orice fel de citate de deschidere
\p{Pf} \p{Final_Punctuation} orice fel de citate de încheiere
\p{Pc} \p{Connector_Punctuation} caractere de punctuație, cum ar fi litere de subliniere sau cuvinte compuse
\p{Po} \p{Other_Punctuation} orice fel de caractere de punctuație care nu sunt puncte, paranteze, ghilimele sau conectori
Personaje de control
\p{C} \p{Other} caractere de control invizibile și poziții neutilizate
\p{Cc} \p{Control} Caractere de control ASCII sau Latin-1: 0x00-0x1F și 0x7F-0x9F
\p{Cf} \p{Format} indicatori de formatare invizibili
\p{Co} \p{Private_Use} orice posturi rezervate pentru uz personal
\p{Cs} \p{Surrogate} jumătate din perechile surogat codificate în UTF-16
\p{Cn} \p{Unassigned} orice poziții care nu au simboluri atribuite

Expresii regulate fuzzy

În unele cazuri, este convenabil să folosiți expresii obișnuite pentru a analiza fragmente de text în limbaj natural , adică scrise de oameni și eventual care conțin greșeli de scriere sau utilizări nestandard ale cuvintelor. De exemplu, dacă efectuați un sondaj (de exemplu, pe un site web) „ce stație de metrou folosiți”, se poate dovedi că vizitatorii pot indica „Nevsky Prospekt” ca:

  • Nevski
  • Nevsk. Ave.
  • Nou bulevard
  • emb. Canalul Griboedov („Canalul Griboedov” este numele celei de-a doua ieșiri din stația de metrou Nevsky Prospekt)

Aici, expresiile regulate obișnuite nu sunt aplicabile, în primul rând din cauza faptului că cuvintele incluse în modele pot să nu se potrivească foarte precis (fuzzy), dar, cu toate acestea, ar fi convenabil să descriem dependențele structurale dintre elementele modelului. cu expresii regulate, de exemplu, în cazul nostru indică faptul că potrivirea poate fi cu eșantionul „Nevsky Prospekt” SAU „Canalul Griboedov”, în plus, „Prospect” poate fi prescurtat la „pr” sau absent, iar abrevierea „Eb. „ poate fi plasat înaintea „Canal”.

Această sarcină este similară cu căutarea full-text , diferă prin aceea că aici un fragment scurt trebuie comparat cu un set de modele, iar în căutarea full-text, dimpotrivă, modelul este de obicei unul, în timp ce fragmentul de text este foarte mare , sau problema dezambiguerii lexicale , care, totuși, nu permite specificarea unor relații de structurare între elementele de tipar.

Există un număr mic de biblioteci care implementează mecanismul de expresie regulată cu posibilitatea unei comparații neclare:

  • TRE este o bibliotecă C gratuită care utilizează sintaxa expresiei regulate asemănătoare POSIX (proiect stabil);
  • FREJ este o bibliotecă Java open-source care utilizează o sintaxă în formă de Lisp și nu are multe dintre caracteristicile expresiilor regulate convenționale, dar se concentrează pe diferite tipuri de înlocuiri automate ale fragmentelor de text (versiunea beta).

Implementări

  • NFA ( nondeterministice  finite-state automata  - non- deterministice finite automata ) utilizează un algoritm de backtracking greedy , verificând toate expansiunile posibile ale unei expresii regulate într-o anumită ordine și alegând prima valoare potrivită. NFA poate gestiona subexpresii și referințe inverse. Dar datorită algoritmului de rollback, NFA tradițională poate verifica același loc de mai multe ori, ceea ce afectează negativ viteza de lucru. Deoarece NFA tradițională primește prima potrivire pe care o găsește, este posibil să nu găsească cea mai lungă potrivire (acest lucru este cerut de standardul POSIX și există modificări ale NFA care îndeplinesc această cerință - GNU sed ). Acest mecanism de expresie regulată este folosit, de exemplu, în Perl , Tcl și .NET .
  • DFA ( eng.  deterministice finite-state automata  - deterministice finite automata ) funcționează liniar în timp, deoarece nu folosesc rollback-uri și nu verifică niciodată nicio parte a textului. Se poate garanta că vor găsi cel mai lung șir posibil. Un DFA conține doar o stare finală, deci nu se ocupă de referințe înapoi și, de asemenea, nu acceptă constructii de extensii explicite, ceea ce înseamnă că nu poate gestiona nici subexpresiile. DFA este folosit în lex și egrep , de exemplu .

Vezi și

Note

  1. docs.oracle.com . Preluat la 20 august 2013. Arhivat din original la 9 septembrie 2013.
  2. MSDN . Preluat la 11 iulie 2011. Arhivat din original la 15 septembrie 2012.
  3. Aho A., Ulman J. Theory of parsing, translation and compilation. Analiza sintactică. - Lumea. - M. , 1978. - T. 2.
  4. Multe cărți folosesc ∪, + sau ∨ în loc de |.
  5. Nikita Popov. Adevărata putere a expresiilor regulate (15 iunie 2012). Preluat la 30 mai 2019. Arhivat din original la 16 mai 2019. Traducere: Adevărata putere a expresiilor regulate Arhivat 30 mai 2019 la Wayback Machine .
  6. Vladimir Komendantsky. Problemă de potrivire pentru expresii regulate cu variabile // Tendințe în programarea funcțională : al 13-lea simpozion internațional, TFP 2012, St Andrews, Marea Britanie, 12-14 iunie 2012, lucrări selectate revizuite. — Springer, 2013. — P. 149–150. — ISBN 9783642404474 .
  7. Pentru a utiliza secvențele de litere, trebuie să setați pagina de cod corectă, în care aceste secvențe vor merge în ordine de la și la caracterele specificate. Pentru limba rusă, acestea sunt Windows-1251 , ISO 8859-5 și Unicode , deoarece în DOS-855 , DOS-866 și KOI8-R literele rusești nu fac parte dintr-un grup întreg sau nu sunt ordonate alfabetic. O atenție deosebită trebuie acordată literelor cu semne diacritice , cum ar fi rusă Ё / ё, care sunt de obicei împrăștiate în afara intervalelor de caractere principale.
  8. ↑ UTS #18: Expresii regulate Unicode  . Preluat la 8 august 2021. Arhivat din original la 8 august 2021.
  9. Variază în funcție de implementarea motorului de expresii regulate
  10. Există o notație echivalentă [[:word:]]
  11. Există o notație echivalentă [[^[:word:]]

Literatură

  • Friedl, J. Regular Expressions = Mastering Regular Expressions. - Sankt Petersburg. : „Petru” , 2001. - 352 p. — (Biblioteca programatorului). — ISBN 5-318-00056-8 .
  • Smith, Bill. Metode și algoritmi de calcul pe șiruri (regexp) = Computing Patterns in Strings. - M . : „Williams” , 2006. - 496 p. — ISBN 0-201-39839-7 .
  • Forta, Ben. Învață-ți propriile expresii regulate. 10 minute pe lecție = Sams Teach Yourself Regular Expressions in 10 Minutes. - M . : „Williams” , 2005. - 184 p. — ISBN 5-8459-0713-6 .
  • Jan Goyverts, Steven Levitan. Expresii obisnuite. Carte de bucate = Expresii regulate: Carte de bucate. - Sankt Petersburg. : „Simbol-Plus” , 2010. - 608 p. - ISBN 978-5-93286-181-3 .
  • Melnikov SV Perl pentru programatori profesioniști. Expresii obisnuite. - M . : „Binom” , 2007. - 190 p. — (Fundamentele tehnologiei informației). — ISBN 978-5-94774-797-3 .
  • Michael Fitzgerald. Expresii obisnuite. Bazele. - M. : „Williams” , 2015. - 144 p. — ISBN 978-5-8459-1953-3 .

Link -uri