regex - expresiones regulares POSIX.2
Las expresiones regulares ("ER"s), tal y como se definen en POSIX.2,
tienen dos formas: ER modernas (tal y como
egrep; llama a estas ER
"extendidas" de POSIX.2) y ER obsoletas (las que usa
ed(1);
son ER "básicas" de POSIX.2). Las ER obsoletas existen como
tales por mantener la compatibilidad para algunos viejos programas; y
serán discutidas al final. POSIX.2 deja abiertos algunos aspectos de la
sintaxis y semántica de las ER; "(dg" es una de las
decisiones tomadas al respecto de estos temas que puede no ser portable con
otras implementaciones de la POSIX.2.
Una ER (moderna) es una (!) o más de una(!)
rama no vacía,
separadas por '|'. Acepta cualquier cosa que se corresponda con una de las
ramas.
Una rama es una(!) o más de una
pieza, concatenadas. Acepta algo
que corresponda con la primera, seguida por algo que corresponda con la
segunda, etc.
Una pieza es un
átomo posiblemente seguido por un solo(!) '*',
'+', '?', o por un
límite. Un átomo seguido por '*'
ajusta con una secuencia de 0 o más átomos. Un átomo
seguido por '+' ajusta con una secuencia de 1 o más átomos. Un
átomo seguido por '?' ajusta con una secuencia de 0 o 1 átomo.
Un
límite es un '{' seguido por un entero decimal sin signo,
posiblemente seguido por una ',' posiblemente seguida por otro entero decimal
sin signo, y todo acabado por un '}'. Los enteros deben encontrarse entre 0 y
RE_DUP_MAX (255(!)) inclusive, y si hay dos de ellos, el primero no
podrá ser mayor que el segundo. Un átomo seguido por un
límite conteniendo un solo entero
i y sin coma ajusta con una
secuencia de exactamente
i átomos. Un átomo seguido por
un límite conteniendo un entero
i y una coma ajusta con una
secuencia de
i o más átomos. Un átomo seguido por
un límite conteniendo dos enteros
i y
j ajusta con una
secuencia de entre
i y
j átomos (ambos inclusive).
Un átomo es una expresión regular dentro de "
()"
(ajustándose con una aparición de la expresión regular),
un conjunto vacío de "
()" (ajustando con una cadena
vacía)(!), una
expresión con corchetes (ver abajo), '.'
(ajustándose con un solo carácter), '^' (ajustando con la cadena
vacía al principio de una linea), '$' (ajustando con la cadena
vacía al final de una linea), un '\' seguido por uno de los caracteres
"
^.[$()|*+?{\" (ajustando con es carácter tenido como
un carácter normal), un '\' seguido de otro carácter(!)
(ajustando con ese carácter tenido como un carácter ordinario,
como si el '\' no estuviera presente(!)), o un solo carácter sin
ningún otro significado adicional (ajustando con ese carácter).
Un A '{' seguido de un carácter diferente de un dígito es un
carácter ordinario, no el principio de un límite.(!) Es ilegal
terminar una ER con '\'.
Una
expresión con corchetes es una lista de caracteres entre unos
"
[]". Normalmente ajusta con solo uno de los caracteres de
la lista (pero vea más adelante). Si la lista comienza por '^', ajusta
con un solo carácter (pero vea más adelante) que
no
pertenezca al resto de la lista. Si hay en la lista dos caracteres separados
por '-', es una abreviación de un
rango completo de caracteres
entre dos (inclusive) en la secuencia, por ejemplo "
[0-9]"
en ASCII ajusta con cualquier dígito decimal. Es ilegal(!) que dos
intervalos compartan un carácter, p. ej: "
a-c-e". Los
rangos son muy dependientes de la secuencia de especificación y los
programas portables deberían evitar utilizarlos.
Para incluir un literal '' en la lista, debe aparecer el primero en la misma
(siguiendo a un posible '^'). Para incluir un literal '-'), debe aparecer el
primero o el último en la lista, o ser el segundo carácter de un
rango. Para usar un literal '-') como el primer carácter de un rango,
debe rodearse entre "
[." y "
.]" para
hacerlo un elemento a tratar (vea más abajo). Con la excepción
de estas y algunas combinaciones que usan '[' (vea los siguientes
párrafos), todos los otros caracteres especiales, incluyendo '\',
pierden su significado especial dentro de una expresión entre
corchetes.
Dentro de una expresión entre corchetes, un elemento a tratar (un
carácter, una secuencia de más de un carácter que se
interpreta como si fuera un solo carácter, o un nombre de secuencia de
definición incluido entre "
[." y "
.]" se entiende como la secuencia de caracteres de ese elemento.
La secuencia es un elemento aislado de la lista contenida en la
expresión con corchetes. Una expresión con corchetes que
contenga un elemento de más de un carácter puede ajustar por
más de un carácter, por ejemplo si la secuencia incluye un
elemento "ch", entonces la ER "
[[.ch.]]*c" ajusta
con los primeros cinco caracteres de "chchcc".
Dentro de una expresión con corchetes, un elemento englobado entre "
[=" y "
=]" es una clase de equivalencia,
comprendiendo las secuencias de caracteres de todos los elementos equivalentes
a ese otro, incluyéndose a él mismo. (Si no hay ningún
otro elemento equivalente, el tratamiento es como si los delimitadores
hubieran sido "
[." y "
.]".) Por ejemplo, si
o y ^ son miembros de una clase de equivalencia, entonces, entonces "
[[=o=]]", "
[[='=]]" y "
[oo']"
son todos sinónimos. Una clase de equivalencia no(!) puede ser el
extremo de un intervalo.
Dentro de una expresión con corchetes, el nombre de una
clase de
caracteres englobado entre "
[:" y "
:]"
se interpreta como la lista de todos los caracteres que pertenecen a esa
clase. Los nombre de clase de caracteres estándar son:
alnum |
digit |
punct |
alpha |
graph |
space |
blank |
lower |
upper |
cntrl |
print |
xdigit |
Están compuestos por las clases de caracteres definidos en
wctype(3). Localmente podrán proveerse de otras. Una clase de
caracteres no puede formar parte de un rango.
En el caso en que una ER puede ajustar con más de una subcadena de la
cadena dada, la ER se ajusta con aquella que comience antes en la cadena dada.
Si la ER puede ajustar con varias subcadenas que comienzan en el mismo punto,
se ajusta con la más larga. Las subexpresiones también ajustan
con las subcadenas más largas posibles, sujetas a la restricción
de que el ajuste global sea el más largo posible, con subexpresiones
que empiecen antes en la ER con mayor prioridad que aquellas que comiencen
después. Nótese que las subexpresiones de nivel más alto
tienen prioridad respecto a sus subexpresiones componentes de nivel inferior.
Las longitudes de los ajustes son medidas en caracteres, no en elementos. Una
cadena vacía se considera más larga que cualquier otro ajuste.
Por ejemplo, "bb*" se ajusta con los tres caracteres del centro de
"abbbc", "
(wee|week)(knights|nights)" se ajusta
con los diez caracteres de "weeknights" , cuando "
(.*).*" se intenta ajustar con "abc" la
subexpresión se ajusta con los tres caracteres, y cuando "
(a*)*" se intenta ajustar con "bc" tanto la ER como la
subexpresión entre paréntesis se ajustan a la cadena
vacía.
Si se ha especificado un ajuste no dependiente de las mayúsculas, el
efecto es como si todas las distinciones entre mayúsculas y
minúsculas hubieran desaparecido del alfabeto. Cuando un término
del alfabeto existe tanto en mayúsculas como en minúsculas
aparece como un carácter ordinario fuera de una expresión con
corchetes, se transforma en una expresión con corchetes conteniendo los
dos casos, por ejemplo, 'x' se convierte en "
[xX]". Cuando
aparece dentro de una expresión con corchetes, todos los casos posibles
son añadidos a la expresión con corchetes, de tal manera que
(por ejemplo) "
[x]" se convierte en "
[xX]"
y "
[^x]" se convierte en "
[^xX]".
No se impone ningún límite en particular en la longitud de las
ER(!). Los programas que deban ser portables no deben emplear ER más
largas de 256 bytes, ya que una implementación puede rechazar el
aceptar estas ER y seguir cumpliendo POSIX.
Las expresiones regulares obsoletas ("basic") difieren en varios
aspectos. '|', '+' y '?' son caracteres ordinarios y no existe el equivalente
para sus funcionalidades. Los delimitadores para los límites son "
\{" y "
\}", con '{' y '}' como caracteres
ordinarios. Los paréntesis para subexpresiones anidadas son "
\(" y "
\)", siendo '(' and ')' caracteres
ordinarios. '^' es un carácter ordinario excepto en el principio de la
ER o(!) al principio de una subexpresión con paréntesis, '$' es
un carácter ordinario excepto al final de la ER o(!) al final de una
subexpresión con paréntesis, y '*' es un carácter
ordinario si aparece al principio de la ER o al principio de una
subexpresión con paréntesis (después de un posible '^')
inicial).
Finalmente, existe un nuevo tipo de átomo, la
referencia hacia
atrás: '\' seguido por un dígito decimal mayor que cero
d ajusta con la misma secuencia de caracteres ajustada por la
subexpresión con paréntesis
d-ésima (numerando las
subexpresiones por las posiciones de sus paréntesis de apertura, y de
izquierda a derecha), de tal manera que (por ejemplo) "
\([bc]\)\1" ajusta con "bb" o "cc" pero no con
"bc".
Tener dos tipos de ER es molesto.
La especificación actual de POSIX.2 dice que un ')' es un carácter
ordinario en ausencia de un '(' sin ajustar; este fue un resultado no
intencionado de un error de redacción, y es probable que sea
modificado. Evite usarlo.
Las referencias hacia atrás son una espantosa 'chapuza', añadiendo
bastantes problemas para una implementación eficiente. También
hay cosas vagamente definidas (¿ "
a\(\(b\)*\2\)*d"
ajusta con "abbbd"?). Evite usarlo.
La especificación POSIX.2 sobre el ajuste independiente de
mayúsculas es muy vaga. La definición "mayúsculas o
minúsculas implican al otro" (
N. del T. "one case
implies all cases") dada arriba es un consenso entre todos los
implementadores como la buena interpretación.
Esta página ha sido obtenida del paquete regex de Henry Spencer.
grep(1),
regex(3)
POSIX.2, sección 2.8 (Regular Expression Notation).
La traducción al español de esta página del manual fue
creada por Juan José López Mellado <
[email protected]>
y Marcos Fouces <
[email protected]>
Esta traducción es documentación libre; lea la
GNU
General Public License Version 3 o posterior con respecto a las
condiciones de copyright. No existe NINGUNA RESPONSABILIDAD.
Si encuentra algún error en la traducción de esta página
del manual, envíe un correo electrónico a
[email protected]