PCRE

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 .

Funciones de biblioteca

Funciones básicas

pcre * pcre_compile ( const char * patrón , int opciones , const char ** errptr , int * erroffset , const unsigned char * tableptr );

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

Extracción de subcadenas

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

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 .

Compatible con POSIX

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.

Compilación justo a tiempo

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]

  • ARM v5, v7 y Thumb2
  • Intel x86 de 32 bits y 64 bits
  • MIPS de 32 bits
  • Power PC de 32 bits y 64 bits
  • SPARC de 32 bits (experimental)
  • TileGX (experimental desde 8.34) [3]

Ejemplo de uso

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

Notas

  1. https://github.com/PCRE2Project/pcre2/releases/tag/pcre2-10.40 - 2022.
  2. 1 2 Manual de funciones de la biblioteca  PCRE(3 ) . Consultado el 29 de octubre de 2013. Archivado desde el original el 28 de noviembre de 2017.
  3. Jiong Wang (Corporación Tilera). Agregue compatibilidad con JIT para la arquitectura TileGX de 64 bits.  (inglés)  (enlace no disponible) (14 de octubre de 2013). — Un parche que agrega un traductor JIT para la arquitectura TileGX a la biblioteca PCRE (más de 12,000 líneas). Archivado desde el original el 29 de octubre de 2013.

Enlaces