PCRE | |
---|---|
Tipo de | biblioteca de expresiones regulares |
Desarrollador | Felipe Hazel [d] |
Escrito en | C |
Sistema operativo | multiplataforma |
ultima versión |
|
Licencia | BSD |
Sitio web | pcre.org |
PCRE ( Expresiones regulares compatibles con Perl ) es una biblioteca que implementa expresiones regulares de estilo Perl (con algunas diferencias). La sintaxis de expresiones regulares PCRE es mucho más potente y flexible que las expresiones regulares POSIX estándar .
De una forma u otra, está disponible para muchos lenguajes de programación. En particular, en PHP , el módulo PCRE está incluido en el núcleo.
El autor de la biblioteca es Philip Hazel . La biblioteca está escrita en C y se distribuye bajo la licencia gratuita BSD .
La función pcre_compile compila una expresión regular en la representación interna de la biblioteca. El primer argumento es una referencia a una cadena que contiene la expresión regular. En el segundo, se pueden especificar varios atributos (correspondientes a las opciones /igms... en Perl ). El último argumento es una referencia a la tabla de codificación creada por pcre_maketables . Devuelve NULL si se produjo un error al compilar la plantilla.
int pcre_exec ( const pcre * code , const pcre_extra * extra , const char * subject , int length , int startoffset , int options , int * ovector , int ovecsize );La función pcre_exec se utiliza para encontrar coincidencias. El primer argumento es el valor devuelto por pcre_compile . El segundo contiene información adicional devuelta por la función pcre_study . Los siguientes tres argumentos son la cadena que se analizará, su longitud y el desplazamiento a partir del cual se procesará la cadena. Luego, un parámetro que especifica las opciones (consulte la documentación para obtener una descripción detallada de las mismas).
En los dos últimos argumentos, debe especificar una referencia a la matriz reservada de enteros y su longitud. Esta matriz contiene pares de índices que indican el inicio y el final de las coincidencias. Los dos primeros elementos de la matriz describen la posición de toda la expresión coincidente. Los pares restantes son la posición de las subcadenas que coincidieron con las expresiones entre paréntesis en la plantilla (análogos de variables como $1 en Perl ).
pcre_extra * pcre_study ( const pcre * code , int options , const char ** errptr );La función acelera el trabajo de un programa que realiza muchas coincidencias con el mismo patrón. Crea una variable que almacena información adicional sobre la plantilla, acelerando su procesamiento por la función pcre_exec
const char sin firmar * pcre_maketables ( void );Crea una tabla de símbolos para usar con la función pcre_compile
Obtiene una de las subcadenas encontradas de la cadena. Para ello, se indica el número de la subcadena encontrada. Estas funciones se diferencian entre sí en que pcre_copy_substring escribe el resultado en un búfer al que ya se le ha asignado memoria, mientras que pcre_get_substring asigna memoria para el búfer y escribe el resultado en él.
Los primeros cuatro parámetros de estas funciones son los mismos: el primero es la cadena en la que se realizó la búsqueda, el segundo es el arreglo creado por la función pcre_exec , el tercero es el valor devuelto por la función pcre_exec, es decir, el número de subcadenas encontradas, el cuarto es el número de la subcadena deseada.
Las funciones devuelven la longitud de la subcadena si tienen éxito; de lo contrario, un valor negativo es el código de error.
int pcre_get_substring_list ( const char * subject , int * ovector , int stringcount , const char *** listptr );Obtiene todas las subcadenas encontradas de una cadena.
void pcre_free_substring ( const char * stringptr ); void pcre_free_substring_list ( const char ** stringptr );Libera la memoria asignada por pcre_get_substring y pcre_get_substring_list , respectivamente .
PCRE también implementa funciones de expresiones regulares compatibles con POSIX . Estas funciones no se pueden utilizar para procesar cadenas ASCII no básicas :
int regcomp ( regex_t * preg , const char * patrón , 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 ); anular libre de registros ( regex_t * preg );La función regerror convierte el código de error devuelto por las funciones regcomp y regexec en un mensaje de error. El primer parámetro es el código de error. El segundo es la plantilla compilada. La tercera es la línea donde se escribirá el mensaje. El cuarto es su longitud máxima.
La función regfree libera la variable que contiene la plantilla compilada, que se pasa como parámetro. Se utiliza cuando desea utilizar la misma variable para varias búsquedas.
Esta característica opcional está disponible en la versión 8.20 y posteriores si se activó cuando se creó la biblioteca PCRE. Las mayores ganancias de rendimiento son posibles, por ejemplo, cuando el programa de llamada reutiliza expresiones regulares compiladas previamente. El soporte JIT fue escrito por Zoltan Herczeg [2] y no está diseñado para interfaces POSIX y C++. El traductor incorporado funciona en las siguientes arquitecturas: [2]
Este es un ejemplo de un programa simple en C++ . La expresión regular y la cadena se especifican en el texto fuente (Compilar con el modificador -lpcre).
# incluir <iostream> # incluir <cadena.h> # incluir <pcre.h> utilizando el espacio de nombres estándar ; int principal () { patrón char [] = "[es]" ; // patrón (expresión regular) char str [] = "prueba" ; // cadena analizada // creando una tabla de conversión para la configuración regional ru const unsigned char * tables = NULL ; setlocale ( LC_CTYPE , ( const char * ) "ru." ); tablas = pcre_maketables (); // compilando la expresión regular en una representación interna pcre * re ; int opciones = 0 ; const char * error ; Desplazamiento de error interno ; re = pcre_compile (( char * ) patrón , opciones , & error , & erroffset , NULL ); if ( ! re ) { // en caso de error de compilación cerr << "Error en el desplazamiento" << erroffset << ":" << error << " \n " ; } más { número int = 0 ; int ovector [ 30 ]; cuenta = pcre_exec ( re , NULL , ( char * ) str , strlen ( str ), 0 , 0 , ovector , 30 ); // realizar coincidencia de patrones if ( ! count ) { // si no hay coincidencia cout << "No hay coincidencia \n " ; } más { //pares de salida {comienzo, fin} coincidencias para ( int c = 0 ; c < 2 * cuenta ; c += 2 ) { if ( ovector [ c ] < 0 ) { // o <unset> para subexpresiones no coincidentes cout << "<unset> \n " ; } más { cout << ovector [ c ] << ovector [ c + 1 ] << " \n " ; } } } } // libera los datos asignados a la memoria pcre_free (( void * ) re ); pcre_free (( void * ) tablas ); devolver 0 ; }