REGEX(7)

NOMBRE
regex - expresiones regulares POSIX.2

DESCRIPCIÓN
Las expresiones regulares ("ER"s), tal y como se definen en POSIX.2, tienen dos formas: ERs modernas (tal y como egrep; llama a estas ERs "extendidas" de POSIX.2) y ERs obsoletas (las que usa ed(1); son ERs "básicas" de POSIX.2). Las ERs 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).

An atom is a regular expression enclosed in "()" (matching a match for the regular expression), an empty set of "()" (matching the null string)(!), a bracket expression (see below), '.' (matching any single character), '^' (matching the null string at the beginning of a line), '$' (matching the null string at the end of a line), a '\' followed by one of the characters "^.[$()|*+?{\" (matching that character taken as an ordinary character), a '\' followed by any other character(!) (matching that character taken as an ordinary character, as if the '\' had not been present(!)), or a single character with no other significance (matching that character). A '{' followed by a character other than a digit is an ordinary character, not the beginning of a bound(!). It is illegal to end an RE with '\'.

A bracket expression is a list of characters enclosed in "[]". It normally matches any single character from the list (but see below). If the list begins with '^', it matches any single character (but see below) not from the rest of the list. If two characters in the list are separated by '-', this is shorthand for the full range of characters between those two (inclusive) in the collating sequence, for example, "[0-9]" in ASCII matches any decimal digit. It is illegal(!) for two ranges to share an endpoint, for example, "a-c-e". Ranges are very collating-sequence-dependent, and portable programs should avoid relying on them.

To include a literal ']' in the list, make it the first character (following a possible '^'). To include a literal '-', make it the first or last character, or the second endpoint of a range. To use a literal '-' as the first endpoint of a range, enclose it in "[." and ".]" to make it a collating element (see below). With the exception of these and some combinations using '[' (see next paragraphs), all other special characters, including '\', lose their special significance within a bracket expression.

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

Within a bracket expression, a collating element enclosed in "[=" and "=]" is an equivalence class, standing for the sequences of characters of all collating elements equivalent to that one, including itself. (If there are no other equivalent collating elements, the treatment is as if the enclosing delimiters were "[." and ".]".) For example, if o and o are the members of an equivalence class, then "[[=o=]]", "[[=o=]]", and "[oo]" are all synonymous. An equivalence class may not(!) be an endpoint of a range.

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.

If case-independent matching is specified, the effect is much as if all case distinctions had vanished from the alphabet. When an alphabetic that exists in multiple cases appears as an ordinary character outside a bracket expression, it is effectively transformed into a bracket expression containing both cases, for example, 'x' becomes "[xX]". When it appears inside a bracket expression, all case counterparts of it are added to the bracket expression, so that, for example, "[x]" becomes "[xX]" and "[^x]" becomes "[^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.

Obsolete ("basic") regular expressions differ in several respects. '|', '+', and '?' are ordinary characters and there is no equivalent for their functionality. The delimiters for bounds are "\{" and "\}", with '{' and '}' by themselves ordinary characters. The parentheses for nested subexpressions are "\(" and "\)", with '(' and ')' by themselves ordinary characters. '^' is an ordinary character except at the beginning of the RE or(!) the beginning of a parenthesized subexpression, '$' is an ordinary character except at the end of the RE or(!) the end of a parenthesized subexpression, and '*' is an ordinary character if it appears at the beginning of the RE or the beginning of a parenthesized subexpression (after a possible leading '^').

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

ERRORES
Tener dos tipos de ERs 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.

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

VÉASE TAMBIÉN
grep(1), regex(3)

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

COLOFÓN
Esta página es parte de la versión 5.10 del proyecto Linux man-pages. Puede encontrar una descripción del proyecto, información sobre cómo informar errores y la última versión de esta página en https://www.kernel.org/doc/man-pages/.

TRADUCCIÓN
La traducción al español de esta página del manual fue creada por Juan José López Mellado <laveneno@hotmail.com> Esta traducción es documentación libre; lea la GNU General Public License Version 3 (https://www.gnu.org/licenses/gpl-3.0.html) 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 debian-l10n-spanish@lists.debian.org>..