## Declaraciones

Una declaración es una comprobación de los caracteres siguientes o anteriores al punto de coincidencia actual que en realidad no consumen carácter alguno. Las declaraciones simples codificadas como \b, \B, \A, \Z, \z, ^ y $ están descritas en secuencias de escape. Las declaraciones más complicadas están codificadas como sub-patrones. Hay dos tipos: aquéllas que buscan hacia delante desde punto actual de la cadena objetivo, y aquéllas que buscan hacia atrás desde él.

Un patrón declaración es comparado de la forma habitual, excepto que no causa que la posición actual de coincidencia cambie. Las declaraciones de búsqueda hacia delante comienzan con (?= para declaraciones positivas y con (?! para declaraciones negativas. Por ejemplo, `\w+(?=;)` coincide con una palabra seguida de un punto y coma, pero no incluye el punto y coma en la coincidencia, y `foo(?!bar)` coincide con cualquier incidencia de "foo" que no esté seguida de "bar". Observe que el patrón aparentemente similar `(?!foo)bar` no encuentra una incidencia de "bar" que esté precedida por algo distinto de "foo"; no encuentra ninguna incidencia de "bar" en absoluto, ya que la declaración (?!foo) es siempre `true` cuando los tres caracteres siguientes son "bar". Se necesita una declaración de búsqueda hacia atrás para conseguir este efecto.

Las declaraciones de búsqueda hacia atrás comienzan con (?<= para declaraciones positivas y con (?<! para declaraciones negativas. Por ejemplo, `(?<!foo)bar` encuentra una incidencia de "bar" que no esté precedida por "foo". El contenido de una declaración de búsqueda hacia atrás está restringido de tal manera que todas las cadenas que se comparen con ella deben tener una longitud fija. Sin embargo, si hay varias alternativas, no es necesario que tengan todas la misma longitud fija. Así, `(?<=buey|burro)` está permitido, pero `(?<!toros?|vacas?)` produce un error en tiempo de compilación. Las ramas que se comparan con cadenas de diferente longitud están permitidas sólo en el nivel superior de una declaración de búsqueda hacia atrás. Esto es una extensión comparado con Perl 5.005, la cual requiere que todas las ramas a comparar tengan la misma longitud de cadena. Una declaración como `(?<=ab(c|de))` no está permitida porque su rama del nivel superior puede coincidir con dos longitudes diferentes, pero es aceptable si se reescribe para usar dos ramas del nivel superior: `(?<=abc|abde)` La implementación de las declaraciones de búsqueda hacia atrás es, para cada alternativa, retroceder temporalmente la posición actual por el ancho fijo y después intentar coincidir. Si no hay suficientes caracteres antes de la posición actual, la comparación está condenada a fallar. Las declaraciones de búsqueda hacia atrás junto con los sub-patrones de una sóla aplicación pueden ser particularmente útiles para comparaciones con los finales de las cadenas; se da un ejemplo al final de la sección de sub-patrones de una sóla aplicación.

Varias declaraciones (de cualquier tipo) pueden producirse en suceción. Por ejemplo, `(?<=\d{3})(?<!999)foo` coincide con "foo" precedido de tres dígitos que no sean "999". Nótese que cada una de las declaraciones es aplicada en el mismo punto de la cadena objetivo. Primero, se verifica que los tres caracteres previos son todos dígitos, depués se verifica que esos mismos tres caracteres no sean "999". Este patrón no coincide con "foo" precedido de seis caracteres, los primeros de los cuales son dígitos y los tres últimos de éllos no son "999". Por ejemplo, no coincide con "123abcfoo". Un patrón que hace eso es `(?<=\d{3}...)(?<!999)foo`

Esta vez, la primera declaración examina los seis caracteres precedentes, verificando que los tres primeros son dígitos, y después, la segunda declaración verifica que los tres caracteres anteriores no son "999".

Las declaraciones pueden estar anidadas en cualquier combianción. Por ejemplo, `(?<=(?<!foo)bar)baz` coincide con una incidencia de "baz" que está precedida por "bar", la cual a su vez no está precedida por "foo", mientras que `(?<=\d{3}...(?<!999))foo` es otro patrón que coincide con "foo" precedido por tres dígitos y otros tres caracteres cualesquiera que no sean "999".

Los sub-patrones declarativos no son sub-patrones de captura, y no se pueden repetir, ya que no tiene sentido declarar la misma cosa varias veces. Si cualquier tipo de declaración contiene sub-patrones de captura dentro de ella, éstos son contados con el propósito de numerar los sub-patrones de captura en el patrón completo. Sin embargo, la captura de subcadenas se realiza sólo para declaraciones positivas, ya que no tiene sentido para declaraciones negativas.

Las declaraciones cuentan para el máximo de 200 sub-patrones entre paréntesis.