NOMBRE¶
regex - expresiones regulares POSIX 1003.2
DESCRIPCIÓN¶
Las expresiones regulares (``ER''s), tal y como se definen en POSIX 1003.2,
tienen dos formas: ERs modernas (tal y como
egrep; llama a estas ERs
``extendidas'' de 1003.2) y ERs obsoletas (las que usa
ed(1); son ERs
``básicas'' de 1003.2).
Las ERs obsoletas existen como tales por mantener la compatibilidad para algunos
viejos programas; y serán discutidas al final.
1003.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 1003.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 ese carácter tenido
como un carácter normal), un `\' seguido por 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 `{' seguido
por 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 rangos compartan un carácter,
por ejemplo `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 `[o^]' son todos sinónimos. Una clase de equivalencia no(!)
puede formar parte de un rango.
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.
Hay dos casos especiales(!) de expresiones con corchetes: las expresiones con
corchetes `[[:<:]]' y `[[:>:]]' ajustan con la cadena vacía del
principio y final de una palabra, respectivamente. Una palabra se define como
una secuencia de caracteres de palabra que no se encuentra ni precedida ni
seguida por caracteres de palabra. Un carácter de palabra es un
carácter de la clase
alnum (tal y como se define en
wctype(3)) o un carácter de subrayado. Esta es una extensión,
compatible pero no especificada por POSIX 1003.2, y debe ser usada con cuidado
en aquel software que deba ser portable a otros sistemas.
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 ERs(!).
Los programas que deban ser portables no deben emplear ERs más largas de
256 bytes, ya que una implementación puede rechazar el aceptar estas ERs
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 `(' y `)' 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'.
VÉASE TAMBIÉN¶
regex(3)
POSIX 1003.2, sección 2.8 (Regular Expression Notation).
FALLOS¶
Tener dos tipos de ERs es molesto.
La especificación actual de 1003.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 1003.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.
La sintaxis para límites de palabras es increíblemente desagradable.
AUTOR¶
Esta página ha sido obtenida del paquete regex de Henry Spencer.