PCRE

PCRE
Tip de Biblioteca de expresii regulate
Dezvoltator Philip Hazel [d]
Scris in C
Sistem de operare multiplatformă
ultima versiune
Licență BSD
Site-ul web pcre.org

PCRE ( Perl Compatible Regular Expressions ) este o bibliotecă care implementează expresii regulate în stil Perl (cu unele diferențe). Sintaxa expresiei regulate PCRE este mult mai puternică și mai flexibilă decât expresiile regulate POSIX standard .

Într-o formă sau alta, este disponibil pentru multe limbaje de programare. În special, în PHP modulul PCRE este inclus în nucleu.

Autorul bibliotecii este Philip Hazel . Biblioteca este scrisă în C și distribuită sub licența gratuită BSD .

Funcții bibliotecă

Funcții de bază

pcre * pcre_compile ( const char * model , opțiuni int , const char ** errptr , int * erroffset , const unsigned char * tableptr );

Funcția pcre_compile compilează o expresie regulată în reprezentarea internă a bibliotecii. Primul argument este o referință la un șir care conține expresia regulată. În al doilea, pot fi specificate diverse atribute (corespunzând opțiunilor /igms... din Perl ). Ultimul argument este o referință la tabelul de codificare creat de pcre_maketables . Returnează NULL dacă a apărut o eroare la compilarea șablonului.

int pcre_exec ( const pcre * code , const pcre_extra * extra , const char * subiect , int length , int startoffset , int opțiuni , int * ovector , int ovecsize );

Funcția pcre_exec este folosită pentru a găsi potriviri. Primul argument este valoarea returnată de pcre_compile . Al doilea conține informații suplimentare returnate de funcția pcre_study . Următoarele trei argumente sunt șirul care trebuie analizat, lungimea acestuia și offset-ul de la care va fi procesat șirul. Apoi un parametru care specifică opțiunile (consultați documentația pentru o descriere detaliată a acestora).

În ultimele două argumente, trebuie să specificați o referință la matricea rezervată de numere întregi și lungimea acesteia. Această matrice conține perechi de indecși care indică începutul și sfârșitul potrivirilor. Primele două elemente ale matricei descriu poziția întregii expresii potrivite. Perechile rămase sunt poziția subșirurilor care se potrivesc cu expresiile din paranteze din șablon (analogi ale variabilelor precum $1 în Perl ).

pcre_extra * pcre_study ( const pcre * code , int opțiuni , const char ** errptr );

Funcția accelerează munca unui program care efectuează multe potriviri cu același model. Creează o variabilă care stochează informații suplimentare despre șablon, accelerând procesarea acestuia de către funcția pcre_exec

const unsigned char * pcre_maketables ( void );

Creează un tabel de simboluri pentru utilizare de către funcția pcre_compile

Extragerea subșirurilor

int pcre_copy_substring ( const char * subiect , int * ovector , int stringcount , int stringnumber , char * buffer , int buffersize ); int pcre_get_substring ( const char * subiect , int * vector , int stringcount , int stringnumber , const char ** stringptr );

Obține unul dintre subșirurile găsite din șir. Pentru aceasta, este indicat numărul subșirului găsit. Aceste funcții diferă unele de altele prin aceea că pcre_copy_substring scrie rezultatul într-un buffer căruia i-a fost deja alocată memorie, în timp ce pcre_get_substring alocă memorie pentru buffer și scrie rezultatul în acesta.

Primii patru parametri ai acestor funcții sunt aceiași: primul este șirul în care a fost efectuată căutarea, al doilea este matricea creată de funcția pcre_exec , al treilea este valoarea returnată de funcția pcre_exec, adică numărul de subșiruri găsite, al patrulea este numărul subșirului necesar.

Funcțiile returnează lungimea subșirului dacă au succes, altfel o valoare negativă este codul de eroare

int pcre_get_substring_list ( const char * subiect , int * vector , int stringcount , const char *** listptr );

Obține toate subșirurile găsite dintr-un șir.

void pcre_free_substring ( const char * stringptr ); void pcre_free_substring_list ( const char ** stringptr );

Eliberați memoria alocată de pcre_get_substring și , respectiv, pcre_get_substring_list .

Conform POSIX

PCRE implementează, de asemenea, funcții de expresie regulată compatibile cu POSIX . Aceste funcții nu pot fi utilizate pentru a procesa șiruri de caractere ASCII non-bazice :

int regcomp ( regex_t * preg , const char * pattern , int cflags ); int regexec ( regex_t * preg , const char * string , size_t nmatch , regmatch_t pmatch [], int eflags ); size_t regerror ( int errcode , const regex_t * preg , char * errbuf , size_t errbuf_size ); void regfree ( regex_t * preg );

Funcția regerror convertește codul de eroare returnat de funcțiile regcomp și regexec într-un mesaj de eroare. Primul parametru este codul de eroare. Al doilea este șablonul compilat. A treia este linia în care va fi scris mesajul. A patra este lungimea sa maximă.

Funcția regfree eliberează variabila care deține șablonul compilat, care este transmis ca parametru. Folosit atunci când doriți să utilizați aceeași variabilă pentru mai multe căutări.

Compilare just-in-time

Această caracteristică opțională este disponibilă în versiunea 8.20 și o versiune ulterioară dacă a fost activată când a fost creată biblioteca PCRE. Cele mai mari câștiguri de performanță sunt posibile, de exemplu, atunci când programul apelant reutiliza expresiile regulate compilate anterior. Suportul JIT a fost scris de Zoltan Herczeg [2] și nu este destinat interfețelor POSIX și C++. Traducătorul încorporat lucrează pe următoarele arhitecturi: [2]

  • ARM v5, v7 și Thumb2
  • Intel x86 pe 32 de biți și 64 de biți
  • MIPS pe 32 de biți
  • Power PC pe 32 de biți și 64 de biți
  • SPARC pe 32 de biți (experimental)
  • TileGX (experimental începând cu 8.34) [3]

Exemplu de utilizare

Acesta este un exemplu de program simplu C++ . Expresia regulată și șirul sunt specificate în textul sursă (Compilați cu comutatorul -lpcre).

# include <iostream> # include <string.h> # include <pcre.h> folosind namespace std ; int main () { char pattern [] = "[es]" ; // model (expresie regulată) char str [] = "test" ; // șir analizat // crearea unui tabel de conversie pentru ru locale const unsigned char * tables = NULL ; setlocale ( LC_CTYPE , ( const char * ) "ru." ); tables = pcre_maketables (); // compilarea expresiei regulate într-o reprezentare internă pcre * re ; int opțiuni = 0 ; const char * eroare ; int erofset ; re = pcre_compile (( char * ) model , opțiuni , & error , & erroffset , NULL ); if ( ! re ) { // în cazul unei erori de compilare cerr << "Eșuat la offset " << eroffset << ":" << eroare << " \n " ; } altfel { număr int = 0 ; int vector [ 30 ]; count = pcre_exec ( re , NULL , ( char * ) str , strlen ( str ), 0 , 0 , ovector , 30 ); // efectuează potrivirea modelului if ( ! count ) { // dacă nu se potrivește cout << "Fără potrivire \n " ; } altfel { //perechi de ieșire {început, sfârșit} potriviri pentru ( int c = 0 ; c < 2 * count ; c += 2 ) { if ( ovector [ c ] < 0 ) { // sau <unset> pentru subexpresii nepotrivite cout << "<unset> \n " ; } altfel { cout << ovector [ c ] << ovector [ c + 1 ] << " \n " ; } } } } // eliberează datele alocate pentru memorie pcre_free (( void * ) re ); pcre_free (( void * ) tabele ); returnează 0 ; }

Note

  1. https://github.com/PCRE2Project/pcre2/releases/tag/pcre2-10.40 - 2022.
  2. 1 2 PCRE(3 ) Manual de funcții bibliotecă  . Consultat la 29 octombrie 2013. Arhivat din original la 28 noiembrie 2017.
  3. Jiong Wang (Tilera Corporation). Adăugați suport JIT pentru arhitectura TileGX pe 64 de biți.  (engleză)  (link indisponibil) (14 octombrie 2013). — Un patch care adaugă un translator JIT pentru arhitectura TileGX la biblioteca PCRE (mai mult de 12.000 de linii). Arhivat din original pe 29 octombrie 2013.

Link -uri