PCRE

PCRE
Type Regulære udtryksbibliotek
Udvikler Philip Hazel [d]
Skrevet i C
Operativ system på tværs af platforme
nyeste version
Licens BSD
Internet side pcre.org

PCRE ( Perl Compatible Regular Expressions ) er et bibliotek, der implementerer Perl - stil regulære udtryk (med nogle forskelle). PCRE regulære udtrykssyntaks er meget mere kraftfuld og fleksibel end standard POSIX regulære udtryk .

I en eller anden form er den tilgængelig for mange programmeringssprog. Især i PHP er PCRE-modulet inkluderet i kernen.

Forfatteren af ​​biblioteket er Philip Hazel . Biblioteket er skrevet i C og distribueres under den gratis BSD-licens .

Biblioteksfunktioner

Grundlæggende funktioner

pcre * pcre_compile ( const char * mønster , int muligheder , const char ** errptr , int * erroffset , const unsigned char * tableptr );

Funktionen pcre_compile kompilerer et regulært udtryk i bibliotekets interne repræsentation. Det første argument er en reference til en streng, der indeholder det regulære udtryk. I den anden kan forskellige attributter specificeres (svarende til /igms... mulighederne i Perl ). Det sidste argument er en reference til kodningstabellen oprettet af pcre_maketables . Returnerer NULL, hvis der opstod en fejl under kompilering af skabelonen.

int pcre_exec ( const pcre * kode , const pcre_extra * ekstra , const char * emne , int længde , int startoffset , int optioner , int * ovector , int ovecsize );

Funktionen pcre_exec bruges til at finde matches. Det første argument er værdien returneret af pcre_compile . Den anden indeholder yderligere information returneret af pcre_study- funktionen . De næste tre argumenter er strengen, der skal parses, dens længde og offset, som strengen vil blive behandlet fra. Derefter en parameter, der specificerer mulighederne (se dokumentationen for en detaljeret beskrivelse af dem).

I de sidste to argumenter skal du angive en reference til det reserverede array af heltal og dets længde. Dette array indeholder par af indekser, der angiver starten og slutningen af ​​kampe. De første to elementer i arrayet beskriver positionen af ​​hele det matchede udtryk. De resterende par er positionen af ​​understrenge, der matchede udtrykkene i parentes i skabelonen (analoger af variabler som $1 i Perl ).

pcre_extra * pcre_study ( const pcre * code , int options , const char ** errptr );

Funktionen fremskynder arbejdet i et program, der udfører mange kampe mod det samme mønster. Opretter en variabel, der gemmer yderligere oplysninger om skabelonen, hvilket fremskynder dens behandling af pcre_exec- funktionen

const unsigned char * pcre_maketables ( void );

Opretter en symboltabel til brug af pcre_compile- funktionen

Udpakning af understrenge

int pcre_copy_substring ( konst char * emne , int * ovector , int stringcount , int stringnumber , char * buffer , int bufferstørrelse ); int pcre_get_substring ( const char * emne , int * ovector , int stringcount , int stringnumber , const char ** stringptr );

Henter en af ​​de fundne understrenge fra strengen. Til dette er nummeret på den fundne understreng angivet. Disse funktioner adskiller sig fra hinanden ved, at pcre_copy_substring skriver resultatet til en buffer, der allerede er blevet tildelt hukommelse, mens pcre_get_substring allokerer hukommelse til bufferen og skriver resultatet til den.

De første fire parametre for disse funktioner er de samme: den første er strengen, hvori søgningen blev udført, den anden er arrayet skabt af pcre_exec- funktionen , den tredje er værdien returneret af pcre_exec-funktionen, det vil sige tallet af fundne understrenge, er den fjerde nummeret på den påkrævede understreng.

Funktionerne returnerer længden af ​​understrengen, hvis de lykkes, ellers er en negativ værdi fejlkoden

int pcre_get_substring_list ( const char * emne , int * ovector , int stringcount , const char *** listptr );

Henter alle fundne understrenge fra en streng.

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

Frigør den hukommelse, der er allokeret af henholdsvis pcre_get_substring og pcre_get_substring_list .

POSIX-kompatibel

PCRE implementerer også POSIX -kompatible regulære udtryksfunktioner . Disse funktioner kan ikke bruges til at behandle ikke-grundlæggende ASCII - strenge :

int regcomp ( regex_t * preg , const char * mønster , 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 );

Regerror - funktionen konverterer fejlkoden, der returneres af regcomp- og regexec-funktionerne, til en fejlmeddelelse. Den første parameter er fejlkoden. Den anden er den kompilerede skabelon. Den tredje er den linje, hvor meddelelsen vil blive skrevet. Den fjerde er dens maksimale længde.

Regfree - funktionen frigiver variablen, der indeholder den kompilerede skabelon, som sendes som en parameter. Bruges når du vil bruge den samme variabel til flere opslag.

Just-in-time kompilering

Denne valgfri funktion er tilgængelig i version 8.20 og nyere, hvis den var aktiveret, da PCRE-biblioteket blev bygget. De største præstationsgevinster er for eksempel mulige, når det kaldende program genbruger tidligere kompilerede regulære udtryk. JIT- understøttelse blev skrevet af Zoltan Herczeg [2] og er ikke beregnet til POSIX- og C++-grænseflader. Den indbyggede oversætter fungerer på følgende arkitekturer: [2]

Eksempel på brug

Dette er et eksempel på et simpelt C++- program . Det regulære udtryk og strengen er angivet i kildeteksten (Kompilér med -lpcre-switchen).

# inkluderer <iostream> # include <string.h> # include <pcre.h> bruger navneområde std ; int main () { char pattern [] = "[es]" ; // mønster (regulært udtryk) char str [] = "test" ; // parset streng // oprettelse af en konverteringstabel for ru-lokaliteten const unsigned char * tables = NULL ; setlocale ( LC_CTYPE , ( const char * ) "ru." ); tables = pcre_maketables (); // kompilering af det regulære udtryk til en intern repræsentation pcre * re ; int optioner = 0 ; const char * fejl ; int erroffset ; re = pcre_compile (( char * ) pattern , options , & error , & erroffset , NULL ); if ( ! re ) { // i tilfælde af kompileringsfejl cerr << "Failed at offset" << erroffset << ":" << fejl << " \n " ; } andet { int count = 0 ; int ovector [ 30 ]; count = pcre_exec ( re , NULL , ( char * ) str , strlen ( str ), 0 , 0 , ovector , 30 ); // udfør mønstermatching if ( ! count ) { // if no match cout << "No match \n " ; } andet { //outputpar {begyndelse, slut} matcher for ( int c = 0 ; c < 2 * count ; c += 2 ) { if ( ovector [ c ] < 0 ) { // eller <unset> for umatchede underudtryk cout << "<unset> \n " ; } andet { cout << ovector [ c ] << ovector [ c + 1 ] << " \n " ; } } } } // frigør de data, der er allokeret til hukommelse pcre_free (( void * ) re ); pcre_free (( void * ) tabeller ); returnere 0 ; }

Noter

  1. https://github.com/PCRE2Project/pcre2/releases/tag/pcre2-10.40 - 2022.
  2. 1 2 PCRE(3 ) Library Functions Manual  . Hentet 29. oktober 2013. Arkiveret fra originalen 28. november 2017.
  3. Jiong Wang (Tilera Corporation). Tilføj JIT-understøttelse til 64-bit TileGX-arkitekturen.  (engelsk)  (utilgængeligt link) (14. oktober 2013). — En patch, der tilføjer en JIT -oversætter til TileGX-arkitekturen til PCRE-biblioteket (mere end 12.000 linjer). Arkiveret fra originalen den 29. oktober 2013.

Links