Expresiones regulares
FileMenu Tools utiliza la sintaxis de expresiones regulares del lenguaje de programación Perl. Con las expresiones regulares se pueden definir patrones de búsqueda y reemplazo. Este mecanismo proporciona una gran potencia cuando se quiere buscar y/o reemplazar un texto.
En esta sintaxis todos los caracteres tienen concordancia en sí mismos excepto para los siguientes caracteres especiales:
.[]{}()\*+?|^$
Si se desea utilizar alguno de los caracteres anteriores como literales hay que anteponerle el carácter \. Por ejemplo, si se desea utilizar el carácter ? como literal, habrá que indicarlo con \?, sino se hace así el carácter ? se interpretará como un operador y por lo tanto el comportamiento no sería el deseado.
Carácter comodín
El carácter '.' concuerda con cualquier carácter, excepto el carácter de nueva línea y retorno de carro.
Inicio y final de línea
El carácter ^ concuerda con el inicio de línea, es decir, si se incluye este carácter al inicio del patrón de búsqueda, la búsqueda se producirá sólo al principio de las líneas.
El carácter $ concuerda con el final de línea, es decir, si se incluye este carácter al final del patrón de búsqueda, la búsqueda se producirá sólo al final de las líneas.
Definición de sub-expresiones
Una sección que empieza con ( y termina con ) actúa como una sub-expresión. Las sub-expresiones utilizadas en el patrón de búsqueda son almacenadas en un registro y pueden ser posteriormente referenciadas en el propio patrón de búsqueda o al reemplazar. Para referenciar una sub-expresión se debe utilizar \n, donde n es el índice de la sub-expresión (entre 1 y 9).
Agrupación sin definir sub-expresiones
La definición de una sub-expresión es útil para agrupar parte de una expresión regular, pero tiene el resultado de crearse un nuevo registro para su uso posterior. Como alternativa se puede crear una agrupación en una expresión regular pero sin generar una sub-expresión usando (?: y ). Por ejemplo (?:ab)+ repetirá "ab" sin generar una sub-expresión separada.
Repeticiones
Cualquier carácter o agrupación puede ser repetida usando los operadores *, +, ? y { }.
El operador * concuerda con cero o más repeticiones de la expresión anterior. Por ejemplo: la expresión a*b concuerda con cualquiera de lo siguiente:
b
ab
aaaaaaaab
El operador + concuerda con uno o más repeticiones de la expresión anterior. Por ejemplo: la expresión a+b concuerda con cualquiera de lo siguiente:
ab
aaaaaaaab
Pero no concuerda con:
b
El operador ? concuerda con cero o una repeticiones de la expresión anterior. Por ejemplo: la expresión ca?b concuerda con cualquiera de lo siguiente:
cb
cab
Pero no concuerda con:
caab
Una expresión puede ser repetida n veces con el operador { }, de la siguiente manera:
- a{n} concuerda con n repeticiones de 'a'.
- a{n,} concuerda con n o más repeticiones de 'a'.
- a{n, m} concuerda con n a m repeticiones de 'a'.
Por ejemplo:
^a{2,3}$
Tiene concordancia con alguna de las siguientes:
aa
aaa
Pero no tiene concordancia con:
a
aaaa
No es posible utilizar un operador de repetición si la expresión anterior no puede ser repetida. Por ejemplo::
a(*)
Se producirá un error y no habrá nada donde aplicar el operador *.
Sustituciones
El carácter de escape seguido por un dígito n, donde n está comprendido entre 1 y 9, concuerda la misma cadena que tenía concordancia por la sub-expresión n. Por ejemplo, la expresión siguiente:
^(a*).*\1$
Tiene concordancia con la cadena:
aaabbaaa
Pero no con la cadena:
aaabba
Las sustituciones también pueden ser utilizadas dentro de las expresiones de reemplazo para cuando se reemplaza un texto.
Alternativa
El operador | concuerda con alguno de los argumentos, por ejemplo: abc|def concordará con "abc" o con "def".
El paréntesis puede ser utilizado para agrupar alternativas, por ejemplo: ab(c|ef) concordará con "abc" o con "abef".
Las alternativas vacías no están permitidas. Si se quiere indicar una alternativa vacía es necesario utilizar la directiva (?:), por ejemplo:
"|abc" no es una expresión válida, pero
"(?:)|abc" sí es válida, al igual que la expresión:
"(?:abc)??" que tiene el mismo efecto.
Colección de caracteres:
Una colección de caracteres es una expresión que comienza con [ y termina con ]. Este tipo de expresión concuerda con cualquier carácter que esté incluido dentro de la colección.
Este tipo de expresiones pueden contener cualquier combinación de lo siguiente:
Caracteres:
Por ejemplo: [abc] concordará con cualquiera de los caracteres 'a', 'b', ó 'c'.
Rango de caracteres:
Por ejemplo: [a-c] concordará con cualquier carácter en el rango 'a' a 'c'.
Negación:
Si una expresión encerrada por corchetes comienza con el carácter ^, entonces concordará con el complemento de los caracteres que contiene. Por ejemplo: [^a-c] concordará con cualquier carácter que no esté en el rango a-c.
Clases de caracteres:
Una expresión de la forma [[:nombre:]] concuerda con la clase de carácter cuyo nombre es "nombre". Por ejemplo: [[:lower:]] concuerda con cualquier carácter en minúsculas. Vea las clases de caracteres que son admitidos.
Símbolos:
Mediante la expresión [[.nombre.]] se puede especificar determinados tipos de caracteres cuyo nombre es "nombre". Por ejemplo, con la expresión [[.NUL.]] se especificaría el carácter nulo. Vea los nombres simbólicos que son admitidos.
Clases de equivalencia:
Una expresión de la forma [[=caracter=]] concuerda con cualquiera de las formas equivalentes del carácter indicado, como por ejemplo las mayúsculas/minúsculas, la tilde o cualquier otra forma específica del idioma. Así, por ejemplo [[=a=]] concuerda con los caracteres: a, à, á, â, ã, ä, å, A, À, Á, Â, Ã, Ä y Å.
Combinaciones:
Todas las formas comentadas anteriormente pueden ser combinadas en una expresión más compleja, por ejemplo: [[:digit:]a-c[.NUL.]].
Secuencias de escape
Cualquier carácter especial precedido por la barra vertical \ concordará consigo mismo. Si por ejemplo se desea utilizar el asterisco como carácter literal y no como operador dentro de la expresión, sería necesario utilizar \*.
Las siguientes secuencias son también soportadas:
Caracteres específicos
Las siguientes secuencias de escape son sinónimos para determinados caracteres:
Escape |
Carácter |
\a |
Timbre (0x07). |
\e |
Carácter de ESC (0x1B). |
\f |
Salto de página. |
\n |
Salto de línea. |
\r |
Retorno de carro. |
\t |
Tabulador horizontal. |
\v |
Tabulador vertical. |
\cX |
Un carácter ASCII, cuyo código es X % 32. |
\xdd |
Un carácter ASCII especificado en hexadecimal, cuyo código será 0xdd. |
\x{dddd} |
Un carácter UNICODE especificado en hexadecimal, cuyo código es 0xdddd. |
\0ddd |
Un carácter ASCII especificado en octal, cuyo código es 0ddd. |
\N{nombre} |
Un carácter que coincide con el nombre simbólico "nombre". Por ejemplo: \N{newline} indicará el carácter de salto de línea y por lo tanto sería equivalente a \n. |
Clases de caracteres:
Hay determinadas clases de caracteres que tienen su equivalente como una secuencia de escape.
Carácter de escape |
Equivalente a |
\d |
[[:digit:]] |
\l |
[[:lower:]] |
\s |
[[:space:]] |
\u |
[[:upper:]] |
\w |
[[:word:]] |
\D |
[^[:digit:]] |
\L |
[^[:lower:]] |
\S |
[^[:space:]] |
\U |
[^[:upper:]] |
\W |
[^[:word:]] |
Propiedades de caracteres
Los nombres de propiedades de la siguiente tabla son equivalentes a los nombres utilizados en las clases de caracteres:
Forma |
Descripción |
Equivalente a |
\pX |
Indica cualquier carácter que tiene la propiedad X. |
[[:X:]] |
\p{Nombre} |
Indica cualquier carácter que tiene la propiedad "Nombre". |
[[:Nombre:]] |
\PX |
Indica cualquier carácter que no tiene la propiedad X. |
[^[:X:]] |
\P{Nombre} |
Indica cualquier carácter que no tiene la propiedad "Nombre". |
[^[:Nombre:]] |
Demarcación de palabras
Las siguientes secuencias de escape indican demarcación de palabras:
\< |
Concuerda con el inicio de una palabra. |
\> |
Concuerda con el final de una palabra. |
\b |
Concuerda con el inicio y el final de una palabra. |
\B |
Concuerda sólo cuando no se está en el inicio o el final de una palabra. |
Secuencia de literales
La secuencia de escape \Q comienza una secuencia de literales, es decir, todos los caracteres que vengan después serán tratados como literales, hasta que se alcanza el final de la expresión o se especifica la secuencia de escape \E. Por ejemplo, la expresión: \Q\*+\Ea+ concuerda con alguna de las siguientes cadenas:
\*+a
\*+aaa
Cualquier otra secuencia de escape
Cualquier otra secuencia de escape concordará con el carácter indicado. Por ejemplo \@ concordará con el literal '@'.
Extensiones
Todas las extensiones comienzan con (? y finalizan con ).
Comentarios
(?# ... ) es tratado como un comentario, y por lo tanto su contenido será ignorado.
Agrupaciones sin generar sub-expresiones
Una expresión de la forma (?:patrón) permite agrupar patrones sin generar una nueva sub-expresión.
Mirar hacia adelante
(?=patrón) consume cero caracteres sólo si el patrón concuerda.
(?!patrón) consume cero caracteres sólo si el patrón no concuerda.
Este tipo de expresión es utilizada normalmente para crear un AND lógico de dos expresiones regulares, por ejemplo si una contraseña debe contener una letra en minúscula, una letra en mayúscula, un símbolo de puntuación, y debe tener al menos 6 caracteres, entonces la expresión:
(?=.*[[:lower:]])(?=.*[[:upper:]])(?=.*[[:punct:]]).{6,}
puede ser utilizada para validar la contraseña.
Mirar hacia atrás
(?<=patrón) consume cero caracteres sólo si el patrón puede tener concordancia con los caracteres que preceden a la posición actual (el patrón debe ser de longitud fija).
(?<!patrón) consume cero caracteres sólo si el patrón no puede tener concordancia con los caracteres que preceden a la posición actual (el patrón debe ser de longitud fija).
Expresiones condicionales
Una expresión de la forma (?(condición)patrón-sí|patrón-no) intenta concordar patrón-sí si la condición es verdadera, en otro caso intentará concordar la expresión patrón-no.
Una expresión de la forma (?(condición)patrón-sí) intenta concordar patrón-sí si la condición es verdadera, en otro caso falla.
La condición puede ser una aserción hacía adelante, o el índice de una sub-expresión (la condición será verdadera si la sub-expresión ha tenido concordancia).
Precedencia de los operadores
El orden de precedencia (de mayor a menor) para los operadores es el mostrado en la siguiente tabla:
Símbolos, clases de caracteres, y clases de equivalencia |
[==] [::] [..] |
Secuencias de escape |
\ |
Colección de caracteres |
[] |
Agrupación |
() |
Repetición |
* + ? {m,n} |
Concatenación |
|
Inicio y final de línea |
^$ |
Alternación |
| |
Nombres de clases
Nombre |
Descripción |
alnum |
Cualquier carácter alfanumérico. |
alpha |
Cualquier carácter alfabético. |
blank |
Cualquier espacio en blanco. |
cntrl |
Cualquier carácter de control. |
d |
Cualquier dígito decimal. |
digit |
Cualquier dígito decimal. |
graph |
Cualquier carácter gráfico. |
l |
Cualquier carácter en minúsculas. |
lower |
Cualquier carácter en minúsculas. |
|
Cualquier carácter imprimible. |
punct |
Cualquier carácter de puntuación. |
s |
Cualquier espacio en blanco. |
space |
Cualquier espacio en blanco. |
unicode |
Cualquier carácter extendido cuyo código está por encima de 255. |
u |
Cualquier carácter en mayúsculas. |
upper |
Cualquier carácter en mayúsculas. |
w |
Cualquier carácter perteneciente a una palabra (caracteres alfanuméricos y el carácter de subrayado). |
word |
Cualquier carácter perteneciente a una palabra (caracteres alfanuméricos y el carácter de subrayado). |
xdigit |
Cualquier carácter en hexadecimal. |
Nombres de símbolos
Nombre |
Carácter |
NUL |
\x00 |
SOH |
\x01 |
STX |
\x02 |
ETX |
\x03 |
EOT |
\x04 |
ENQ |
\x05 |
ACK |
\x06 |
alert |
\x07 |
backspace |
\x08 |
tab |
\t |
newline |
\n |
vertical-tab |
\v |
form-feed |
\f |
carriage-return |
\r |
SO |
\xE |
SI |
\xF |
DLE |
\x10 |
DC1 |
\x11 |
DC2 |
\x12 |
DC3 |
\x13 |
DC4 |
\x14 |
NAK |
\x15 |
SYN |
\x16 |
ETB |
\x17 |
CAN |
\x18 |
EM |
\x19 |
SUB |
\x1A |
ESC |
\x1B |
IS4 |
\x1C |
IS3 |
\x1D |
IS2 |
\x1E |
IS1 |
\x1F |
space |
\x20 |
exclamation-mark |
! |
quotation-mark |
" |
number-sign |
# |
dollar-sign |
$ |
percent-sign |
% |
ampersand |
& |
apostrophe |
' |
left-parenthesis |
( |
right-parenthesis |
) |
asterisk |
* |
plus-sign |
+ |
comma |
, |
hyphen |
- |
period |
. |
slash |
/ |
zero |
0 |
one |
1 |
two |
2 |
three |
3 |
four |
4 |
five |
5 |
six |
6 |
seven |
7 |
eight |
8 |
nine |
9 |
colon |
: |
semicolon |
; |
less-than-sign |
< |
equals-sign |
= |
greater-than-sign |
> |
question-mark |
? |
commercial-at |
@ |
left-square-bracket |
[ |
backslash |
\ |
right-square-bracket |
] |
circumflex |
~ |
underscore |
_ |
grave-accent |
` |
left-curly-bracket |
{ |
vertical-line |
| |
right-curly-bracket |
} |
tilde |
~ |
DEL |
\x7F |