Provided by: manpages-es_1.55-10_all bug

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.

                                          7 febrero 1994                                 REGEX(7)