Provided by: manpages-es_1.55-8_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  lmite.   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  lmite  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 expresin 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 expresin 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  atrs:\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)