Una afirmación es una prueba sobre los caracteres que siguen o preceden al punto de coincidencia actual que no consume realmente ningún carácter. Las afirmaciones simples codificadas como \b, \B, \A, \Z, \z, ^ y $ se describen en secuencias de escape. Las afirmaciones más complicadas se codifican como subpatrones. Hay dos tipos: aquellos que miran hacia adelante de la posición actual en la cadena de sujeto, y aquellos que miran hacia atrás de ella.
Un subpatrón de afirmación se coincide de la manera normal, excepto
que no hace que la posición de coincidencia actual cambie. Afirmaciones de anticipación comienzan con (?= para afirmaciones positivas y (?! para afirmaciones 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 ocurrencia de "foo" que no esté seguida por
"bar". Tenga en cuenta que el patrón aparentemente similar
(?!foo)bar
no encuentra una ocurrencia de "bar" que esté precedida por algo que no sea "foo"; encuentra cualquier ocurrencia de "bar"
en absoluto, porque la afirmación (?!foo) es siempre true
cuando los siguientes tres caracteres son "bar". Se necesita una afirmación de retroceso para lograr este efecto.
Afirmaciones de retroceso comienzan con (?<= para afirmaciones positivas y (?<! para afirmaciones negativas. Por ejemplo,
(?<!foo)bar
sí encuentra una ocurrencia de "bar" que no está precedida por
"foo". Una afirmación de retroceso puede coincidir con cadenas de longitud
variable, hasta una longitud máxima definida por la implementación.
Las alternativas de longitudes diferentes, como
(?<!dogs?|cats?)
y las ramas de nivel superior que pueden coincidir con más de una longitud, como
(?<=ab(c|de))
están permitidas.
La implementación de afirmaciones de retroceso es, para cada alternativa, mover temporalmente la posición actual hacia atrás por el ancho fijo y luego intentar coincidir. Si no hay suficientes caracteres antes de la posición actual, la coincidencia se considera fallida. Los retrocesos en conjunto con subpatrones de una sola vez pueden ser particularmente útiles para coincidir al final de las cadenas; se da un ejemplo al final
de la sección sobre subpatrones de una sola vez.
Antes de PHP 8.4.0, que incluye PCRE2 10.44, el contenido de una afirmación de
retroceso estaba restringido de tal manera que todas las cadenas con las que
coincidía debían tener una longitud fija. Si había varias alternativas, no todas
tenían que tener la misma longitud fija, por lo tanto
(?<=bullock|donkey)
estaba permitido, pero
(?<!dogs?|cats?)
causaba un error en el momento de la compilación. Las ramas que coincidían con
cadenas de diferentes longitudes estaban permitidas solo al nivel superior de una
afirmación de retroceso. Esto era una extensión en comparación con Perl 5.005, que
requería que todas las ramas coincidieran con la misma longitud de cadena. Una
afirmación como
(?<=ab(c|de))
no estaba permitida, porque su única rama de nivel superior podía coincidir con dos
longitudes diferentes, pero era aceptable si se reescribía para usar dos ramas de
nivel superior:
(?<=abc|abde)
Varias afirmaciones (de cualquier tipo) pueden ocurrir en sucesión.
Por ejemplo,
(?<=\d{3})(?<!999)foo
coincide con "foo" precedido por tres dígitos que no son "999".
Observe que cada una de las afirmaciones se aplica independientemente
en el mismo punto de la cadena de sujeto. Primero hay una verificación de que los tres caracteres anteriores son todos dígitos,
luego hay una verificación de que los mismos tres caracteres no son "999". Este patrón no coincide con "foo" precedido por seis
caracteres, el primero de los cuales son dígitos y los últimos tres de los cuales no son "999". Por ejemplo, no coincide
con "123abcfoo". Un patrón para hacer eso es
(?<=\d{3}...)(?<!999)foo
Esta vez la primera afirmación mira los seis caracteres anteriores, verificando que los primeros tres son dígitos, y luego la segunda afirmación verifica que los tres caracteres anteriores no son "999".
Las afirmaciones pueden anidarse en cualquier combinación. Por ejemplo,
(?<=(?<!foo)bar)baz
coincide con una ocurrencia de "baz" que es precedida por "bar"
que a su vez no es precedida por "foo", mientras que
(?<=\d{3}...(?<!999))foo
es otro patrón que coincide con "foo" precedido por tres
dígitos y cualquier tres caracteres que no son "999".
Los subpatrones de afirmación no son subpatrones de captura, y no pueden repetirse, porque no tiene sentido afirmar lo mismo varias veces. Si cualquier tipo de afirmación contiene subpatrones de captura dentro de ella, estos se cuentan para los fines de numerar los subpatrones de captura en todo el patrón. Sin embargo, la captura de subcadenas solo se lleva a cabo para afirmaciones positivas, porque no tiene sentido para afirmaciones negativas.
Las afirmaciones cuentan hacia el máximo de 200 subpatrones entre paréntesis.