La repetición se especifica mediante cuantificadores, los cuales pueden ir detrás de cualquiera de los siguientes elementos:
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:
* |
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".