====== Referencia compacta de expresiones regulares (PCRE) ====== El propósito de esta página es proporcionar una breve recopilación de las expresiones regulares compatibles con Perl (de ahi las siglas PCRE, //Perl Compatible Regular Expressions//) más frecuentemente utilizadas. ===== Introducción ===== Las expresiones regulares de Perl son muy similares a las expresiones regulares extendidas del estándar POSIX, aunque con algunas adiciones que permiten mayor funcionalidad para el tratamiento de texto. El proyecto PCRE surgió para crear una librería que permitiese el uso de tales expresiones sin el requerimiento de Perl, y muchas aplicaciones populares (Exim, Postfix, Squid, Apache, PHP, y un largo etcétera) se apoyan en dicha librería.((Como la librería tiene licencia BSD, puede utilizarse también en aplicaciones de código privativo, por lo que su empleo debe ser muy superior al reportado oficialmente.)) Si a esto añadimos que la mayoría de los lenguajes de programación soportan expresiones regulares muy similares a estas, resulta evidente entonces que dominarlas es sumamente útil. ===== Sintaxis ===== La sintaxis de las expresiones regulares puede resultar extraña al principio, pero uno llega a familiarizarse rápidamente con ella en cuanto comienza a utilizar estas expresiones habitualmente. ==== Sintaxis básica ==== ^ Expresión ^ Comportamiento ^ | ''m/regex/'' | Buscar coincidencias con la expresión //regex// (las barras delimitan el inicio y fin de la expresión, en este caso la m no es imprescindible) | | ''m/regex/i'' | Buscar coincidencias con la expresión //regex// ignorando mayúsculas/minúsculas | | ''s/regex1/regex2/'' | Búsqueda y reemplazo de //regex1// con //regex2// (solo la primera ocurrencia) | | ''s/regex1/regex2/g'' | Búsqueda y reemplazo de //regex1// con //regex2// (global) | ==== Caracteres especiales ==== ^ Expresión ^ Comportamiento ^ | ''{}[]()^$.|*+?'' | Metacarácter, para buscar coincidencias con estos caracteres, hay que anular (escapar) con ''\'' | | ''\'' | Anular (escapar) el próximo metacarácter | | ''|'' | Alternación | | ''()'' | Agrupación | | ''[...]'' | Coincidir con un carácter que esté entre los corchetes | | ''[^...]'' | Coincidir con un carácter que no esté en los corchetes | ==== Rangos de caracteres ==== ^ Expresión ^ Comportamiento ^ | ''[a-z]'' | Coincidir con un carácter entre la a y la z (minúsculas) | | ''[A-Z]'' | Coincidir con un carácter entre la A y la Z (mayúsculas) | | ''[0-9]'' | Coincidir con un carácter entre 0 y 9 | ==== Comodines o abreviaturas ==== ^ Expresión ^ Comportamiento ^ | ''.'' | Coincidir con un carácter cualquiera de la línea | | ''\w'' | Coincidir con un carácter de palabra (alfanumérico más "_") | | ''\W'' | Coincidir con un carácter que no sea de palabra | | ''\l'' | Coincidir con un carácter alfabético en minúsculas (equivalente a ''[a-z]'') | | ''\u'' | Coincidir con un carácter alfabético en mayúsculas (equivalente a ''[A-Z]'') | | ''\t'' | Coincidir con un carácter de tabulación | | ''\s'' | Coincidir con un carácter de espaciado (incluyendo la tabulación) | | ''\S'' | Coincidir con un carácter que no sea de espaciado | | ''\d'' | Coincidir con un carácter de dígito decimal (equivalente a ''[0-9]'') | | ''\D'' | Coincidir con un carácter que no sea de dígito decimal | | ''\n'' | Coincidir con un carácter de nueva línea (LF, NL) | | ''\r'' | Coincidir con un carácter de retorno (CR) | | ''\R'' | Coincidir con una combinación de salto de línea (CRLF, LFCR, o fin de línea de Unicode) | | ''\N'' | Coincidir con un carácter que no sea de salto de línea | | ''\f'' | Coincidir con un carácter de salto de página (FF) | ==== Coincidencias de posición ==== ^ Expresión ^ Comportamiento ^ | ''^'' | Coincidir con el inicio de la línea o cadena de texto | | ''$'' | Coincidir con el final de la línea o cadena de texto | | ''\b'' | Coincidir con el límite de una palabra | | ''\B'' | Coincidir con el límite de una no-palabra | ==== Factores de repetición (avariciosos) ==== (Coincidir el máximo de veces posible) ^ Expresión ^ Comportamiento ^ | ''*'' | Coincidir 0 o más veces | | ''+'' | Coincidir 1 o más veces | | ''?'' | Coincidir 0 o 1 vez | | ''{n}'' | Coincidir exactamente //n// veces | | ''{n,}'' | Coincidir al menos //n// veces | | ''{n,m}'' | Coincidir al menos //n// veces, pero no más de //m// veces | ==== Factores de repetición (perezosos) ==== (Coincidir el mínimo de veces posible) ^ Expresión ^ Comportamiento ^ | ''*?'' | Coincidir 0 o más veces | | ''+?'' | Coincidir 1 o más veces | | ''??'' | Coincidir 0 o 1 vez | | ''{n}?'' | Coincidir exactamente //n// veces | | ''{n,}?'' | Coincidir al menos //n// veces | | ''{n,m}?'' | Coincidir al menos //n// veces, pero no más de //m// veces | ==== Look-Ahead y Look-Behind ==== Este concepto es menos transparente que los anteriores, por ello se ejemplifica brevemente cada caso. ^ Expresión ^ Comportamiento ^ | ''(?=...)'' | Aserción positiva //look-ahead// de longitud cero. Ej. ''regex1(?=regex2)'' encuentra una coincidencia si se encuentran tanto //regex1// como //regex2//, pero no incluye //regex2// en el resultado. | | ''(?!...)'' | Aserción negativa //look-ahead// de longitud cero. Ej. ''regex1(?!regex2)'' encuentra una coincidencia si se encuentra //regex1// y no //regex2//, pero no incluye //regex2// en el resultado. | | ''(?<%%=%%...)'' | Aserción positiva //look-behind// de longitud cero. Ej. ''(?[Lmv]as Esta expresión coincidiría con "Las", "mas" y "vas". per+o Esta expresión coincidiría con "pero" y también con "perro". cant?a Esta expresión coincidiría con "canta" y también con "cana". [a-z]+p. Esta expresión coincidiría con "arpa", "mp3", "pp.", "zip!", etcétera, pero no con "REPO". ^(.*)[^.]$ Esta expresión coincidiría con cualquier línea cuyo último carácter no sea un punto. (www|webmail)\.(mi|tu)?ejemplo\.cu Esta expresión coincidiría con las siguientes URLs: * %%www.miejemplo.cu%% * %%www.tuejemplo.cu%% * %%www.ejemplo.cu%% * %%webmail.miejemplo.cu%% * %%webmail.tuejemplo.cu%% * %%webmail.ejemplo.cu%% ^(\d){2,4}-(\d){4}$ Esta expresión coincidiría con las líneas que tengan solo números telefónicos con formatos como "06-0101", "831-4949" o "5264-2266", pero nunca con la forma "861-75-55". ===== Notas ===== Convendría ampliar/mejorar la sección de ejemplos, y revisar el artículo en general. ===== Atribuciones ===== * **Autor:** Hugo Florentino