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.