PHP 8.5.0 Beta 2 available for testing

Afirmaciones

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.

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top