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 .
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
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 .
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.
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]
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 ; }