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". El contenido de una afirmación de retroceso está restringido
de tal manera que todas las cadenas que coincide deben tener una longitud fija. Sin embargo, si hay varias alternativas, no todas tienen que tener la misma longitud fija. Por lo tanto
(?<=bullock|donkey)
está permitido, pero
(?<!dogs?|cats?)
causa un error en el momento de la compilación. Las ramas que coinciden con cadenas de diferentes longitudes están permitidas solo al nivel superior
de una afirmación de retroceso. Esto es una extensión en comparación con Perl 5.005, que requiere que todas las ramas coincidan con la misma longitud de cadena. Una afirmación como
(?<=ab(c|de))
no está permitida, porque su única rama de nivel superior puede coincidir con dos longitudes diferentes, pero es aceptable si se reescribe para usar dos ramas de nivel superior:
(?<=abc|abde)
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.
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.