PHP 8.1.28 Released!

Repetición

La repetición se especifica mediante cuantificadores, los cuales pueden ir detrás de cualquiera de los siguientes elementos:

  • un único carácter, posiblemente escapado
  • el metacarácter . (punto)
  • una clase carácter
  • una retroreferencia (véase la siguiente sección)
  • un sub-patrón entre paréntesis (a menos que haya una declaración - véase más adelante)

El cuantificador de repetición general especifíca un mínimo y un máximo del número de coincidencias pertmitidas, dándose los dos números entre llaves, separados por una coma. Los números deben ser menores que 65536, y el primero debe ser menor o igual que el segundo. Por ejemplo: z{2,4} coincide con "zz", "zzz", o "zzzz". Una llave de cierre por sí misma no es un carácter especial. Si se omite el segundo número, pero la coma está presente, no hay límite superior; si el segundo número y la coma se omiten, el cuantificador especifica un número exacto de coincidencias requeridas. Así [aeiou]{3,} coincide al menos con 3 vocales sucesivas, pero puede coincidir con muchas más, mientras que \d{8} coincide exactamente con 8 dígitos. Una llave que aparezca en una posición donde no se permite un cuantificador, o una que no coincida con la sintaxis de un cuantificador, se toma como un carácter literal. Por ejemplo, {,6} no es un cuantificador, sino una cadena literal de cuatro caracteres.

El cuantificador {0} está permitido, lo que provoca que la expresión se comporte como si el elemento anterior y el cuantificador no estuvieran presentes.

Por conveniencia (y compatibilidad histórica) los tres cuantificadores más comunes tiene como abreviatura un carácter simple:

Cuantificadores de carácter simple
* equivale a {0,}
+ equivale a {1,}
? equivale a {0,1}

Es posible construir bucles infinitos mediante un sub-patrón que pueda no coincidir con caracteres, seguido de un cuantificador que no tenga límite superior, por ejemplo: (a?)*

Versiones anteriores de Perl y PCRE solían dar un error en tiempo de ejecución para tales patrones. Sin embargo, ya que hay casos donde esto puede ser útil, tales patrones se aceptan ahora, pero si cualquier repetición de un sub-patrón de hecho no coincide con caracteres, el bucle se abandona a la fuerza.

Por defecto, los cuantificadores son "codiciosos", es decir, comparan todo lo posible (hasta el número máximo de veces permitido), sin provocar que el resto del patrón falle. El ejemplo clásico de cómo esto da problemas es al intentar coincidir comentarios de programas en C. Éstos aparecen entre las secuencias /* y */ y dentro de la secuencia, pueden aparecer caracteres * y / individuales. Un intento de coincidir comentarios en C aplicando el patrón /\*.*\*/ a la cadena /* primer comentario */ no comentado /* segundo comentario */ falla, ya que coincide con la cadena completa debido a que el elemento .* es codicioso.

Sin embargo, si un cuantificador es seguido por un signo de interrogación, entonces se convierte en perezoso, coincidiendo el mínimo número de veces posible, así el patrón /\*.*?\*/ funciona de forma correcta con los comentarios en C. Por lo demás, el significado de los diferentes cuantificadores no varía, sólo el número de coincidencias preferidas. No confunda este uso del signo de interrogación con su uso como un cuantificador por derecho propio. Ya que tiene dos usos, puede aparecer a veces doble, como en \d??\d que coincide con un dígito preferentemente, pero puede coincidir con dos si esa es la única manera de que el resto del patrón coincida.

Si la opción PCRE_UNGREEDY se establece (una opción que no está disponible en Perl), los cuantificadores no son codiciosos por defecto, pero puede hecérselos codiciosos si les sigue un signo de interrogación. En otras palabras, invierte el comportamiento por defecto.

Los cuantificadores seguidos de + son "posesivos". Consumen tantos caracteres como les es posible y no retornan para coincidir con el resto del patrón. Así, .*abc coincide con "aabc" pero .*+abc no, ya que .*+ consume la cadena entera. Se pueden usar los cuantificadores posesivos para acelerar el procesamiento.

Cuando un sub-patrón entre paréntesis es cuantificado con un mínimo de cuenta de repeticiones que es mayor que 1 o con un máximo limitado, se necesita más capacidad de almacenamiento para el patrón compilado, en proporción al tamaño del mínimo o máximo.

Si un patrón comienza con .* o .{0,} y la opción PCRE_DOTALL (equivalente a la de Perl /s) está establecida, así permitiendo al . (punto) coincidir con nuevas líneas, entonces el patrón está implícitamente anclado, ya que cualquier cosa que haya a continuación se seguirá intentando comparar con cada posición de carácter en la cadena objetivo, por lo que no sirve de nada volver a intentar la comparación completa desde cualquier posición después de la primera. PCRE trata estos patrones como si estuvieran precedidos por \A. En los casos donde se sabe que la cadena objetivo no contiene nuevas líneas, vale la pena establecer PCRE_DOTALL cuando el patrón comienza con .* para obtener esta optimización, o alternativamente, usar ^ para indicar explícitamente el anclado.

Cuando se repite un sub-patrón de captura, el valor capturado es la subcadena que coincide con la iteración final. Por ejemplo, después de que (tweedle[dume]{3}\s*)+ se haya comparado con "tweedledum tweedledee" el valor del sub-patrón de captura es "tweedledee". Sin embargo, si hay sub-patrones de captura anidados, los valores capturados correspondientes pueden haber sido establecidos en iteraciones previas. Por ejemplo, después de que /(a|(b))+/ se compare con "aba", el valor del segundo sub-patrón de captura es "b".

add a note

User Contributed Notes

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