La repetición se especifica mediante cuantificadores, que pueden seguir cualquiera de los siguientes elementos:
El cuantificador general de repetición especifica un número mínimo y máximo de coincidencias permitidas, dando los dos
números entre llaves (llaves), separados por una coma.
Los números deben ser menores que 65536, y el primero debe ser
menor o igual al segundo. Por ejemplo:
z{2,4}
coincide con "zz", "zzz", o "zzzz". Una llave de cierre por sí sola
no es un carácter especial. Si el segundo número se omite,
pero la coma está presente, no hay límite superior; si el
segundo número y la coma se omiten ambos, el cuantificador
especifica un número exacto de coincidencias requeridas. Por lo tanto
[aeiou]{3,}
coincide con al menos 3 vocales sucesivas, pero puede coincidir con
muchas más, mientras que
\d{8}
coincide con exactamente 8 dígitos.
Antes de PHP 8.4.0, una llave de apertura que
aparece en una posición donde no se permite un cuantificador, o
una que no coincide 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.
A partir de PHP 8.4.0, la extensión PCRE se incluye con la versión PCRE2 10.44,
que permite patrones como \d{,8}
y se interpretan como \d{0,8}
.
Además, a partir de PHP 8.4.0, los caracteres de espacio alrededor de los cuantificadores como
\d{0 , 8}
y \d{ 0 , 8 }
están permitidos.
El cuantificador {0} está permitido, lo que hace que la expresión se comporte como si el elemento anterior y el cuantificador no estuvieran presentes.
Para mayor comodidad (y compatibilidad histórica) los tres cuantificadores más comunes tienen abreviaturas de un solo carácter:
* |
equivalente a {0,} |
+ |
equivalente a {1,} |
? |
equivalente a {0,1} |
Es posible construir bucles infinitos siguiendo un subpatrón que puede coincidir con cero caracteres con un cuantificador que no tiene límite superior, por ejemplo:
(a?)*
Versiones anteriores de Perl y PCRE solían dar un error en el momento de la compilación para tales patrones. Sin embargo, dado que hay casos en los que esto puede ser útil, tales patrones ahora son aceptados, pero si alguna repetición del subpatrón en realidad coincide con cero caracteres, el bucle se rompe a la fuerza.
Por defecto, los cuantificadores son "codiciosos", es decir, coinciden con la mayor cantidad posible (hasta el número máximo de veces permitido), sin causar que el resto del patrón
falle. El ejemplo clásico donde esto causa problemas es al intentar coincidir con comentarios en programas C. Estos aparecen entre
las secuencias /* y */ y dentro de la secuencia, los caracteres individuales
* y / pueden aparecer. Un intento de coincidir con comentarios C aplicando el patrón
/\*.*\*/
a la cadena
/* first comment */ not comment /* second comment */
falla, porque coincide con toda la cadena debido a la codicia del elemento .*.
Sin embargo, si un cuantificador es seguido por un signo de interrogación,
entonces se vuelve perezoso, y en su lugar coincide con el número mínimo de veces posible, por lo que el patrón
/\*.*?\*/
hace lo correcto con los comentarios C. El significado de los varios cuantificadores no cambia de otra manera, solo el número preferido de coincidencias. No confunda este uso de
signo de interrogación con su uso como cuantificador por sí mismo.
Debido a que tiene dos usos, a veces puede aparecer duplicado, como en
\d??\d
que coincide con un dígito por preferencia, 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 está establecida (una opción que no está disponible en Perl) entonces los cuantificadores no son codiciosos por defecto, pero los individuales pueden hacerse codiciosos siguiendo con un signo de interrogación. En otras palabras, invierte el comportamiento por defecto.
Los cuantificadores seguidos de +
son "poseídos". Consumen
tantos caracteres como sea posible y no regresan para hacer coincidir el resto del
patrón. Por lo tanto, .*abc
coincide con "aabc" pero
.*+abc
no porque .*+
consume toda la cadena. Los cuantificadores poseídos pueden usarse para acelerar el procesamiento.
Cuando un subpatrón entre paréntesis se cuantifica con un conteo de repetición mínimo que es mayor que 1 o con un máximo limitado, se requiere más 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 está establecida (equivalente a /s de Perl), lo que permite que el punto coincida con saltos de línea, entonces el patrón está implícitamente anclado, porque lo que sigue se intentará contra cada posición de carácter en la cadena de sujeto, por lo que no tiene sentido volver a intentar la coincidencia general en cualquier posición después de la primera. PCRE trata un patrón como si estuviera precedido por \A. En casos donde se sabe que la cadena de sujeto no contiene saltos de línea, se obtiene una optimización estableciendo PCRE_DOTALL cuando el patrón comienza con .* para obtener esta optimización, o alternativamente usando ^ para indicar el anclaje explícitamente.
Cuando un subpatrón de captura se repite, el valor capturado es la subcadena que coincidió con la iteración final. Por ejemplo, después de
(tweedle[dume]{3}\s*)+
ha coincidido con "tweedledum tweedledee" el valor de la subcadena capturada es "tweedledee". Sin embargo, si hay
subpatrones de captura anidados, los valores capturados correspondientes pueden haber sido establecidos en iteraciones anteriores. Por ejemplo,
después de
/(a|(b))+/
coincide con "aba" el valor de la segunda subcadena capturada es
"b".