PCRE | |
---|---|
Typ | Knihovna regulárních výrazů |
Vývojář | Philip Hazel [d] |
Zapsáno v | C |
Operační systém | multiplatformní |
Nejnovější verze | |
Licence | BSD |
webová stránka | pcre.org |
PCRE ( Perl Compatible Regular Expressions ) je knihovna, která implementuje regulární výrazy ve stylu Perlu (s určitými rozdíly). Syntaxe regulárního výrazu PCRE je mnohem výkonnější a flexibilnější než standardní regulární výrazy POSIX .
V té či oné podobě je k dispozici pro mnoho programovacích jazyků. Konkrétně v PHP je modul PCRE součástí jádra.
Autorem knihovny je Philip Hazel . Knihovna je napsána v jazyce C a šířena pod bezplatnou licencí BSD .
Funkce pcre_compile zkompiluje regulární výraz do interní reprezentace knihovny. První argument je odkaz na řetězec obsahující regulární výraz. Ve druhém lze zadat různé atributy (odpovídající volbám /igms... v Perlu ). Poslední argument je odkaz na kódovací tabulku vytvořenou pcre_maketables . Vrátí NULL, pokud při kompilaci šablony došlo k chybě.
int pcre_exec ( const pcre * kód , const pcre_extra * extra , const char * předmět , délka int , int startoffset , možnosti int , int * ovector , int ovecsize );K vyhledání shod se používá funkce pcre_exec . První argument je hodnota vrácená pcre_compile . Druhý obsahuje další informace vrácené funkcí pcre_study . Další tři argumenty jsou řetězec, který má být analyzován, jeho délka a offset, od kterého bude řetězec zpracován. Poté parametr specifikující možnosti (jejich podrobný popis naleznete v dokumentaci).
V posledních dvou argumentech musíte zadat odkaz na rezervované pole celých čísel a jeho délku. Toto pole obsahuje dvojice indexů označujících začátek a konec shod. První dva prvky pole popisují polohu celého shodného výrazu. Zbývající páry jsou pozice podřetězců, které odpovídaly výrazům v závorkách v šabloně (analogy proměnných jako $1 v Perlu ).
pcre_extra * pcre_study ( const pcre * kód , možnosti int , const char ** errptr );Funkce urychluje práci programu, který provádí mnoho shod se stejným vzorem. Vytvoří proměnnou, která ukládá další informace o šabloně, čímž urychlí její zpracování funkcí pcre_exec
const unsigned char * pcre_maketables ( void );Vytvoří tabulku symbolů pro použití funkcí pcre_compile
Získá jeden z nalezených podřetězců z řetězce. K tomu je uvedeno číslo nalezeného podřetězce. Tyto funkce se od sebe liší tím, že pcre_copy_substring zapisuje výsledek do vyrovnávací paměti, které již byla přidělena paměť, zatímco pcre_get_substring alokuje paměť pro vyrovnávací paměť a zapisuje do ní výsledek.
První čtyři parametry těchto funkcí jsou stejné: první je řetězec, ve kterém bylo vyhledávání provedeno, druhý je pole vytvořené funkcí pcre_exec , třetí je hodnota vrácená funkcí pcre_exec, tedy číslo z nalezených podřetězců je čtvrtý počet požadovaných podřetězců.
Funkce vrátí délku podřetězce, pokud jsou úspěšné, jinak je záporná hodnota kód chyby
int pcre_get_substring_list ( const char * předmět , int * ovector , int stringcount , const char *** listptr );Získá všechny nalezené podřetězce z řetězce.
void pcre_free_substring ( const char * stringptr ); void pcre_free_substring_list ( const char ** stringptr );Uvolněte paměť přidělenou pomocí pcre_get_substring a pcre_get_substring_list , v daném pořadí .
PCRE také implementuje funkce regulárních výrazů vyhovující standardu POSIX . Tyto funkce nelze použít ke zpracování nezákladních řetězců ASCII :
int regcomp ( regex_t * preg , const char * vzor , int cflags ); int regexec ( regex_t * preg , const char * řetězec , size_t nmatch , regmatch_t pmatch [], int flags ); size_t regerror ( int errcode , const regex_t * preg , char * errbuf , size_t errbuf_size ); void regfree ( regex_t * preg );Funkce regerror převede kód chyby vrácený funkcemi regcomp a regexec na chybovou zprávu. Prvním parametrem je kód chyby. Druhým je zkompilovaná šablona. Třetí je řádek, kam bude zpráva napsána. Čtvrtá je její maximální délka.
Funkce regfree uvolní proměnnou obsahující zkompilovanou šablonu, která je předána jako parametr. Používá se, když chcete použít stejnou proměnnou pro více vyhledávání.
Tato volitelná funkce je k dispozici ve verzi 8.20 a vyšší, pokud byla povolena při vytváření knihovny PCRE. Největší zvýšení výkonu je možné například tehdy, když volající program znovu použije dříve zkompilované regulární výrazy. Podpora JIT byla napsána Zoltanem Herczegem [2] a není určena pro rozhraní POSIX a C++. Vestavěný překladač funguje na následujících architekturách: [2]
Toto je příklad jednoduchého programu v C++ . Regulární výraz a řetězec jsou uvedeny ve zdrojovém textu (kompilujte pomocí přepínače -lpcre).
# include <iostream> # include <string.h> # include <pcre.h> pomocí jmenného prostoru std ; int main () { char pattern [] = "[es]" ; // vzor (regulární výraz) char str [] = "test" ; // analyzovaný řetězec // vytvoření převodní tabulky pro národní prostředí ru const unsigned char * tables = NULL ; setlocale ( LC_CTYPE , ( const char * ) "ru." ); tabulky = pcre_maketables (); // kompilace regulárního výrazu do vnitřní reprezentace pcre * re ; int možnosti = 0 ; const char * chyba ; int erroffset ; re = pcre_compile (( char * ) vzor , volby , & chyba , & erroffset , NULL ); if ( ! re ) { // v případě chyby kompilace cerr << "Selhal na offsetu " << erroffset << ":" << chyba << " \n " ; } jinak { int pocet = 0 ; int vector [ 30 ]; počet = pcre_exec ( re , NULL , ( char * ) str , strlen ( str ), 0 , 0 , ovector , 30 ); // provede shodu se vzorem if ( ! count ) { // if no match cout << "No match \n " ; } jinak { //výstupní dvojice {začátek, konec} se shoduje s ( int c = 0 ; c < 2 * počet ; c += 2 ) { if ( ovector [ c ] < 0 ) { // nebo <unset> pro neshodné podvýrazy cout << "<unset> \n " ; } jinak { cout << ovektor [ c ] << ovektor [ c + 1 ] << " \n " ; } } } } // uvolní data alokovaná pro paměť pcre_free (( void * ) re ); pcre_free (( void * ) tabulky ); návrat 0 ; }