regex






regex − expresiones regulares POSIX 1003.2

Las expresiones regulares (‘‘ER’’s), tal y como se definen en POSIX 1003.2,
tienen dos formas: ERs modernas (tal y como llama a estas ERs ‘‘extendidas’’ de
1003.2) y ERs obsoletas (las que usa 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









                                       ‐2‐


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 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 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









                                       ‐3‐


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’.












                                       ‐4‐




     POSIX 1003.2, sección 2.8 (Regular Expression Notation).

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’’ ‘‘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.

Esta página ha sido obtenida del paquete regex de Henry Spencer.