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 anteriormente. 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 sub-cadenas 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.