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.
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.
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 .
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] .
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 caracterMetacaracterul .(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_] | Любой символ, кроме буквенного или цифрового символа или знака подчёркивания |
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) |
\n - line feed
\r - retur carucior
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 трам-трам-трумтрам-трум-трамтрум.
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.
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șeExpresia 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.
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
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 .
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ă feedbackDacă 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ă .
ModificatoriModificatorii 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.
ComentariiPentru 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 . (?#комментарий)А(?#тут комментарий)БАБ
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) | (?<!Сергей )Иванов | Сергей Иванов, Игорь Иванов |
Î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)м|п) | мам,пап |
Î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:
Steagul este specificat după model, de exemplu, astfel: . /[0-9]$/m
( 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:
Particularitati:
( Expresii regulate extinse în engleză (ERE)). Sintaxa este practic aceeași cu cea tradițională.
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.
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}/.
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 |
Î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:
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:
Limbi formale și gramatici formale | |
---|---|
Concepte generale | |
Tip 0 | |
Tipul 1 |
|
Tip 2 | |
Tip 3 | |
analizare |