Perl Compatible Regular Expressions ( PCRE ) es una biblioteca escrita en C que implementa un motor de expresiones regulares , inspirado en las capacidades del lenguaje de programación Perl . Philip Hazel comenzó a escribir PCRE en el verano de 1997. [ 3 ] La sintaxis de PCRE es mucho más potente y flexible que cualquiera de las variantes de expresiones regulares POSIX (BRE, ERE) [ 4 ] y que la de muchas otras bibliotecas de expresiones regulares.
Aunque PCRE originalmente buscaba la equivalencia de características con Perl, las dos implementaciones no son completamente equivalentes. Durante la fase de PCRE 7.x y Perl 5.9.x, los dos proyectos coordinaron su desarrollo, transfiriéndose características entre ellos en ambas direcciones. [ 5 ]
En 2015, se lanzó una bifurcación de PCRE con una interfaz de programación de aplicaciones (API) revisada. El software original, ahora llamado PCRE1 (serie 1.xx–8.xx), ha visto corregidos algunos errores, pero no ha recibido más desarrollo. Aunque todavía se usa en algunos sistemas heredados, PCRE1 ya no se mantiene activamente y se espera que la versión actual 8.45 sea la última. El nuevo código PCRE2 (serie 10.xx) ha recibido varias extensiones y mejoras de codificación, y es donde se lleva a cabo el desarrollo.
Varios programas de código abierto destacados , como los servidores HTTP Apache y Nginx , y los lenguajes de scripting PHP y R , incorporan la biblioteca PCRE; el software propietario también puede hacerlo, ya que la biblioteca tiene licencia BSD. A partir de Perl 5.10, PCRE también está disponible como reemplazo del motor de expresiones regulares predeterminado de Perl a través del re::engine::PCREmódulo.
La biblioteca se puede compilar en Unix, Windows y otros entornos. PCRE2 se distribuye con un envoltorio POSIX C, [ Nota 1 ] varios programas de prueba y el programa de utilidad pcregrep/ pcre2grepque se compila junto con la biblioteca.
Características
Compatibilidad con compiladores justo a tiempo
El compilador justo a tiempo se puede habilitar al compilar la biblioteca PCRE2. Se pueden obtener importantes mejoras de rendimiento cuando, por ejemplo, el programa que realiza la llamada utiliza esta función con patrones compatibles que se ejecutan repetidamente. La compatibilidad con el compilador justo a tiempo fue desarrollada por Zoltan Herczeg y no se aborda en el envoltorio POSIX.
Gestión de memoria flexible
El uso de la pila del sistema para el retroceso puede resultar problemático en PCRE1, por lo que esta característica de la implementación se modificó en PCRE2. Ahora se utiliza el montón para este propósito, y su capacidad total puede limitarse. El problema del desbordamiento de pila , que ocurría con frecuencia en PCRE1, ya no se presenta en PCRE2 a partir de la versión 10.30 (2017).
Reglas de escape consistentes
Al igual que Perl, PCRE2 tiene reglas de escape consistentes: cualquier carácter no alfanumérico puede escaparse para significar su valor literal anteponiendo una \barra invertida (\) antes del carácter. Cualquier carácter alfanumérico precedido por una barra invertida normalmente le da un significado especial. En el caso de que la secuencia no se haya definido como especial, ocurre un error. Esto es diferente a Perl, que da un error solo si está en modo de advertencia (PCRE2 no tiene modo de advertencia). En las expresiones regulares POSIX básicas, a veces las barras invertidas escapaban caracteres no alfanuméricos (por ejemplo, \.), y a veces introducían una característica especial (por ejemplo, \(\)).
Clases de personajes extendidas
Se admiten clases de caracteres de una sola letra, además de los nombres POSIX más largos. Por ejemplo, \dcoincide con cualquier dígito exactamente como [[:digit:]]lo haría en las expresiones regulares POSIX.
Coincidencia mínima (también conocida como "no codiciosa")
?Se puede colocar una después de cualquier cuantificador de repetición para indicar que se debe usar la coincidencia más corta. Por defecto, se intenta primero la coincidencia más larga y luego se retrocede a través de las coincidencias más cortas: por ejemplo a.*?b, coincidiría primero con "ab" en "ababab", mientras que a.*bcoincidiría con toda la cadena.
USi se establece la bandera, los cuantificadores son no codiciosos (perezosos) por defecto, mientras que ?los hace codiciosos.
Propiedades de los caracteres Unicode
Unicode define varias propiedades para cada carácter. Los patrones en PCRE2 pueden coincidir con estas propiedades: por ejemplo, coincidiría con una cadena que comience con cualquier "puntuación de apertura" y termine con cualquier "puntuación de cierre", como . La coincidencia de ciertos metacaracteres "normales" puede ser impulsada por propiedades Unicode cuando se establece la opción de compilación PCRE2_UCP. La opción puede establecerse para un patrón incluyendo al inicio del patrón. La opción altera el comportamiento de los siguientes metacaracteres: , , , , , , , , y algunas de las clases de caracteres POSIX. Por ejemplo, el conjunto de caracteres que coincide con (caracteres de palabra) se amplía para incluir letras y letras acentuadas según lo definido por las propiedades Unicode. Dicha coincidencia es más lenta que la alternativa normal ( solo ASCII ) sin UCP. Tenga en cuenta que la opción UCP requiere que la biblioteca se haya compilado para incluir soporte Unicode (este es el valor predeterminado para PCRE2). Las primeras versiones de PCRE1 solo admitían código ASCII. Posteriormente, se agregó soporte UTF-8 . La compatibilidad con UTF-16 se añadió en la versión 8.30, y la compatibilidad con UTF-32 en la versión 8.32. PCRE2 siempre ha sido compatible con las tres codificaciones UTF.\p{Ps}.*?\p{Pe}[abc](*UCP)\B\b\D\d\S\s\W\w\w
Coincidencia de varias líneas
^y $puede coincidir solo con el principio y el final de una cadena, o con el principio y el final de cada "línea" dentro de la cadena, dependiendo de las opciones que estén configuradas.
Opciones de salto de línea/línea nueva
Cuando se compila PCRE, se selecciona un salto de línea predeterminado. El salto de línea/salto de línea que esté en efecto afecta dónde PCRE detecta ^los inicios y $finales de línea (en modo multilínea), así como lo que coincide con el punto (independientemente del modo multilínea, a menos que (?s)se establezca la opción dotall). También afecta el procedimiento de coincidencia de PCRE (desde la versión 7.0): cuando un patrón no anclado no coincide al comienzo de una secuencia de salto de línea, PCRE avanza más allá de toda la secuencia de salto de línea antes de volver a intentar la coincidencia. Si la alternativa de opción de salto de línea en efecto incluye CRLF como uno de los saltos de línea válidos, no omite el \nen un CRLF si el patrón contiene referencias \ro específicas \n(desde la versión 7.3). Desde la versión 8.10, el metacaracter \Nsiempre coincide con cualquier carácter que no sean caracteres de salto de línea. Tiene el mismo comportamiento que .cuando la opción dotall aka (?s)no está en efecto.
La opción de salto de línea se puede modificar con opciones externas al compilar y ejecutar PCRE. Algunas aplicaciones que utilizan PCRE ofrecen a los usuarios la posibilidad de aplicar esta configuración mediante una opción externa. Por lo tanto, la opción de salto de línea también se puede especificar al inicio del patrón utilizando una de las siguientes opciones:
(*LF)El salto de línea es un carácter de avance de línea. Los saltos de línea correspondientes se pueden emparejar con\n.(*CR)El salto de línea es un retorno de carro . Los saltos de línea correspondientes se pueden emparejar con\r.(*CRLF)El salto de línea es un retorno de carro seguido de un salto de línea. Los saltos de línea correspondientes se pueden emparejar con\r\n.(*ANYCRLF)Cualquiera de los elementos anteriores que se encuentre en los datos activará el procesamiento de saltos de línea. Los saltos de línea correspondientes se pueden hacer coincidir con o con . Consulte a continuación la configuración y las opciones relativas a lo que coincide con la barra invertida seguida de R.(?:\r\n?|\n)\R(*ANY)Cualquiera de las opciones anteriores más saltos de línea especiales Unicode.
Cuando no se está en modo UTF-8, los saltos de línea correspondientes se pueden hacer coincidir con [ Nota 2 ] o .(?:\r\n?|\n|\x0B|\f|\x85)\R
En el modo UTF-8, se reconocen dos caracteres adicionales como saltos de línea con (*ANY):
- LS (separador de línea, U+2028),
- PS (separador de párrafo, U+2029).
En Windows, en los datos que no son Unicode, algunos de los ANYcaracteres de salto de línea tienen otros significados.
Por ejemplo, \x85puede coincidir con una elipsis horizontal, y si se encuentra mientras el ANYsalto de línea está activo, activaría el procesamiento del salto de línea.
Consulte a continuación la configuración y las opciones relativas a lo que coincide con la barra invertida-R.
Opciones de barra invertida-R
Cuando se compila PCRE, se selecciona un valor predeterminado para la coincidencia \R. El valor predeterminado puede coincidir con los saltos de línea correspondientes a ANYCRLF o con los correspondientes a ANY. El valor predeterminado se puede anular cuando sea necesario incluyendo (*BSR_UNICODE)o (*BSR_ANYCRLF)al inicio del patrón. Se puede proporcionar una opción además de una opción, por ejemplo, . Las opciones de barra invertida-R también se pueden cambiar con opciones externas por la aplicación que llama a PCRE2, cuando se compila un patrón.(*newline)(*BSR..)(*BSR_UNICODE)(*ANY)rest-of-pattern
Inicio de las opciones de patrones
Opciones de salto de línea como (*LF)las documentadas anteriormente; opciones de barra invertida-R como las (*BSR_ANYCRLF)documentadas anteriormente; opción de propiedades de caracteres Unicode (*UCP)documentada anteriormente; (*UTF8)opción documentada de la siguiente manera: si PCRE2 se ha compilado con soporte UTF , la (*UTF)opción al principio de un patrón se puede usar en lugar de establecer una opción externa para invocar el modo UTF-8, UTF-16 o UTF-32.
Retroreferencias
Un patrón puede hacer referencia a los resultados de una coincidencia anterior. Por ejemplo, (a|b)c\1coincidiría con "aca" o "bcb" y no coincidiría, por ejemplo, con "acb".
subpatrones con nombre
Un subpatrón (entre paréntesis, como (...)) puede nombrarse añadiendo un prefijo ?P<name>después del paréntesis de apertura. Los subpatrones con nombre son una característica que PCRE adoptó de las expresiones regulares de Python .
Esta característica fue adoptada posteriormente por Perl, por lo que ahora los grupos con nombre también se pueden definir usando (?<name>...)o (?'name'...), así como (?P<name>...). Los grupos con nombre se pueden referenciar retroactivamente con, por ejemplo: (?P=name)(sintaxis de Python) o \k'name'(sintaxis de Perl).
Subrutinas
Mientras que una referencia inversa proporciona un mecanismo para referirse a la parte del sujeto que previamente coincidió con un subpatrón, una subrutina proporciona un mecanismo para reutilizar un subpatrón subyacente previamente definido. Las opciones del subpatrón, como la independencia de mayúsculas y minúsculas, se fijan cuando se define el subpatrón. (a.c)(?1)coincidiría con "aacabc" o "abcadc", mientras que usar una referencia inversa (a.c)\1no lo haría, aunque ambos coincidirían con "aacaac" o "abcabc". PCRE también admite una construcción Oniguruma que no es de Perl para subrutinas. Se especifican usando \g<subpat-number>o \g<subpat-name>.
Agrupación atómica
El agrupamiento atómico es una forma de evitar retrocesos en un patrón. Por ejemplo, a++bccoincidirá con tantas "a" como sea posible y nunca retrocederá para intentar con una menos.
Afirmaciones de anticipación y de retrospectiva
Los patrones pueden afirmar que un texto anterior o posterior contiene un patrón sin consumir el texto coincidente (aserción de ancho cero). Por ejemplo, / \w+(?=\t)/ coincide con una palabra seguida de una tabulación , sin incluir la tabulación en sí.
Las aserciones de búsqueda hacia atrás no pueden tener una longitud incierta, aunque (a diferencia de Perl) cada rama puede tener una longitud fija diferente.
\KSe puede usar en un patrón para restablecer el inicio de la coincidencia completa actual. Esto proporciona un enfoque alternativo flexible a las aserciones de búsqueda hacia atrás porque la parte descartada de la coincidencia (la parte que precede a \K) no necesita tener una longitud fija.
Secuencias de escape para aserciones de ancho cero
Por ejemplo, \bpara hacer coincidir "límites de palabras" de ancho cero, similar a .(?<=\W)(?=\w)|(?<=\w)(?=\W)|^|$
Comentarios
Un comentario comienza con (?#y termina en el siguiente paréntesis de cierre.
Patrones recursivos
Un patrón puede referirse a sí mismo de forma recursiva o a cualquier subpatrón. Por ejemplo, el patrón coincidirá con cualquier combinación de paréntesis balanceados y letras "a".\((a*|(?R))*\)
Llamadas genéricas
Las expresiones PCRE pueden incrustar , donde n es algún número. Esto llamará a una función externa definida por el usuario a través de la API de PCRE y se puede usar para incrustar código arbitrario en un patrón.(?Cn)
Diferencias con Perl
Las diferencias entre PCRE2 y Perl (a partir de Perl 5.9.4) incluyen, entre otras: [ 6 ]
Hasta la versión 10.30, las coincidencias recursivas eran atómicas en PCRE y no atómicas en Perl.
Esto significaba que coincidiría en Perl, pero no en PCRE2 hasta la versión 10.30."<<!>!>!>><>>!>!>!>"=~ /^(<(?:[^<>]+|(?3)|(?1))*>)()(!>!>!>)$/
El valor de un búfer de captura derivado del ?cuantificador (coincidencia 1 o 0 veces) cuando está anidado en otro búfer de captura cuantificado es diferente.
En Perl dará como resultado que contenga "a" y que contenga , pero en PCRE dará como resultado que contenga "b"."aba"=~ /^(a(b)?)+$/;$1$2undef$2
PCRE permite que los búferes de captura con nombre tengan nombres numéricos; Perl requiere que el nombre siga la regla de las palabras sin formato.
Esto significa que \g{}es inequívoco en Perl, pero potencialmente ambiguo en PCRE.
Esto ya no es una diferencia desde PCRE 8.34 (publicado el 15/12/2013), que ya no permite que los nombres de grupo comiencen con un dígito. [ 7 ]
PCRE permite que las alternativas dentro de la búsqueda hacia atrás tengan longitudes diferentes.
En las aserciones de búsqueda hacia atrás, tanto PCRE como Perl requieren patrones de longitud fija.
Es decir, tanto PCRE como Perl no permiten patrones de longitud variable que utilicen cuantificadores dentro de aserciones de búsqueda hacia atrás.
Sin embargo, Perl requiere que todas las ramas alternativas de una aserción lookbehind tengan la misma longitud entre sí, mientras que PCRE permite que esas ramas alternativas tengan longitudes diferentes entre sí, siempre y cuando cada rama siga teniendo una longitud fija.
PCRE no admite ciertas construcciones "experimentales" de Perl.
Tal como (??{...})(una función de devolución de llamada cuyo retorno se evalúa como parte del patrón) ni la (?{})construcción, aunque esta última se puede emular usando (?Cn).
Los verbos de control de recursión añadidos en la serie Perl 5.9.x tampoco son compatibles.
La compatibilidad con los verbos de control de retroceso experimentales (añadidos en Perl 5.10) está disponible en PCRE desde la versión 7.3.
Son (*FAIL), (*F), (*PRUNE), (*SKIP), (*THEN), (*COMMIT), y (*ACCEPT).
El uso correspondiente de argumentos con verbos de control de retroceso en Perl no es compatible de forma general.
Tenga en cuenta, sin embargo, que desde la versión 8.10, PCRE admite los siguientes verbos con un argumento especificado: (*MARK:markName), (*SKIP:markName), (*PRUNE:markName), y (*THEN:markName).
Desde la versión 10.32, PCRE2 ha sido compatible con (*ACCEPT:markName), (*FAIL:markName), y (*COMMIT:markName).
PCRE y Perl difieren ligeramente en su tolerancia a las construcciones erróneas.
Perl permite cuantificadores en la (?!...)construcción, lo cual es insignificante pero inofensivo (aunque ineficiente); PCRE produce un error en versiones anteriores a la 8.13.
PCRE tiene un límite estricto en la profundidad de recursión, Perl no.
Con las opciones de compilación predeterminadas, no coincidirá debido al límite, pero Perl coincidirá correctamente."bbbbXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"=~ /.X(.+)+X/
Perl utiliza el montón para la recursión y no tiene un límite estricto para la profundidad de la recursión, mientras que PCRE2 tiene un límite predeterminado en tiempo de compilación que la aplicación que lo llama puede ajustar hacia arriba o hacia abajo.
Verificación
Con la excepción de los puntos anteriores, PCRE es capaz de pasar las pruebas en el t/op/re_testsarchivo Perl " ", una de las principales pruebas de regresión a nivel de sintaxis para el motor de expresiones regulares de Perl.
Véase también
Notas y referencias
Notas
- ↑ La biblioteca principal PCRE2 proporciona funcionalidad tanto de coincidencia como de coincidencia y reemplazo.
- ↑ ¿ Seguro que laparte no es? (es decir, ya que U+0085 != 0x85) Advertencia : Si el patrónno funcionó: experimente con la configuración Unicode de la implementación de RegEx o intente sustituirlo con lo siguiente:
\x85\xC2\x85(?:\r\n?|\n|\x0B|\f|\xC2\x85)\xC2\x85\x{0085}\u0085
Referencias
- ↑ Versión final de PCRE1: https://lists.exim.org/lurker/message/20210615.162400.c16ff8a3.en.html
- ↑ Versiones: https://github.com/PCRE2Project/pcre2/releases
- ↑ Exim y PCRE: Cómo el software libre secuestró mi vida (1999-12), por Philip Hazel , pág. 7: https://www.ukuug.org/events/winter99/proc/PH.ps
¿Y qué hay de PCRE?
- Escrito en el verano de 1997 y publicado en un sitio FTP.
- La gente lo encontró y creó una lista de correo.
- Se han producido algunas mejoras graduales.
- ↑
- Expresiones regulares - Estándar POSIX: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html
- Utilidades § Notación de coincidencia de patrones: https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/utilities/V3_chap02.html#tag_18_13
- Definiciones básicas § Expresiones regulares básicas: https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/basedefs/V1_chap09.html#tag_09_03
- Fundamentación § Expresiones regulares: https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/xrat/V4_xbd_chap09.html#tag_21_09
- ↑ PCRE2 - Expresiones regulares compatibles con Perl (API revisada) (2020), por la Universidad de Cambridge : https://pcre.org/pcre2.txt
- ↑ Diferencias entre PCRE2 y Perl (13/07/2019), por Philip Hazel : https://www.pcre.org/current/doc/html/pcre2compat.html
- ↑ Cita del registro de cambios de PCRE ( https://www.pcre.org/original/changelog.txt ): "Perl ya no permite que los nombres de grupo comiencen con dígitos, así que también he realizado este cambio en PCRE."
- ↑ Registro de cambios para PCRE2: https://www.pcre.org/changelog.txt
Enlaces externos
- Sitio web oficial

- PCRE - Lista de correo de desarrollo: https://groups.google.com/g/pcre2-dev
- PCRE - Seguimiento de errores: https://github.com/PCRE2Project/pcre2/issues
- Coincidencia de patrones mediante expresiones regulares (2 de marzo de 2010), por Nick Maclaren y Philip Hazel: https://www-uxsup.csx.cam.ac.uk/courses/moved.REs/paper.pdf
- pcre 8.43 (2019-04) - Windows Cygwin x86-64: https://www-uxsup.csx.cam.ac.uk/pub/windows/cygwin/x86_64/release/pcre/
- Coincidencia de patrones
- Bibliotecas de C (lenguaje de programación)
- Perl
- expresiones regulares
- Software que utiliza la licencia BSD.