Le ripetizioni sono il numero delle occorrenze che possono essere indicate dopo i seguenti elementi:
In generale una occorrenza specifica un numero minimo e massimo
di riconoscimenti previsti tramite la specifica dei due limiti,
posti tra parentesi graffe e separati da una virgola. Entrambi i numeri
devono essere minori di 65536 ed il primo deve essere minore o
uguale rispetto al secondo. Ad esempio:
z{2,4}
identifica "zz", "zzz" oppure "zzzz". La parentesi graffa chiusa
di suo non rappresenta un carattere speciale. Se si omette il
secondo numero, ma si lascia la virgola, non si indica un
limite superiore; se sia la virgola sia il secondo numero sono
omessi, l'occorrenza specifica l'esatto numero di riconoscimenti richiesti. Il criterio
[aeiou]{3,}
identifica almeno 3 o più vocali consecutive,
mentre
\d{8}
identifica esattamente 8 cifre. Una parentesi graffa aperta
che compaia in una posizione in cui non sia prevista una
occorrenza, o che comunque non sia riconducibile alla sintassi
di una occorrenza, viene tratta come il carattere "{". Ad
esempio {,6} non indica delle occorrenze, ma una stringa di 4 caratteri.
L'indicazione {0} è permessa. Indica di comportarsi come se l'elemento precedente all'occorrenza non fosse presente.
Per praticità (e compatibilità verso il passato) si usano 3 abbreviazioni per le occorrenze più comuni:
* |
equivale a {0,} |
+ |
equivale a {1,} |
? |
equivale a {0,1} |
E' anche possibile creare un ciclo infinito facendo seguire
ad una sotto-regola che non identifica alcun carattere una
occorrenza priva di limite superiore. Ad esempio:
(a?)*
Le versioni precedenti di Perl e di PCRE segnalavano un errore durante la fase di compila per questi criteri. Tuttavia, poiché vi sono casi dove questi criteri possono essere utili, queste regole sono accettate, ma, se la ripetizione non riconosce alcun carattere, il ciclo viene interrotto.
Per default le occorrenze sono "bramose", infatti identificano
più testi possibile (fino al numero massimo permesso), senza
per questo fare fallire il riconoscimento della parte rimanente
del criterio di ricerca. Il classico esempio dove questo comportamento
può essere un problema, riguarda il riconoscimento dei commenti
nei programmi C. Questi compaiono tra le sequenze /* ed */,
ma all'interno, nel commento, si possono usare sia il carattere
*, sia il carattere /. Il tentativo di individuare i commenti C con il seguente criterio
/\*.*\*/
se applicato al commento
/* primo commento */ nessun commento /* secondo commento */
non ha successo, perché identifica l'intera stringa a causa
della "bramosia" dell'elemento ".*".
Tuttavia, se un'occorrenza è seguita da un punto interrogativo,
questa cessa di essere "bramosa", e identifica il numero
minimo di testi permessi. Pertanto il criterio
/\*.*?\*/
si comporta correttamente con i commenti C. Il significato
delle varie occorrenze non è stato cambiato, si è soltanto
modificato il numero delle occorrenze da riconoscere. Attenzione
a non confondere questo uso del punto interrogativo con il
suo proprio significato. Dati i due utilizzi del ?, può
anche capitare di averli entrambi come in
\d??\d
che, preferibilmente, identifica una cifra, ma può riconoscerne
due se questa è l'unica via per soddisfare il riconoscimento dell'intero criterio.
Se si attiva l'opzione PCRE_UNGREEDY (un'opzione che non è disponibile in Perl), per default le occorrenze non sono "bramose", ma ogni singola occorrenza può essere resa "bramosa" se seguita dal punto interrogativo. In altre parole si è invertito il normale comportamento.
Le occorrenze seguite da +
sono "possessive".
Identificano il maggior numero possibile di caratteri e non riconoscono il
resto del criterio. Quindi .*abc
riconosce "aabc" al contrario di
.*+abc
perché .*+
identifica
tutta la stringa. Le occorrenze possessive possono essere utilizzate per velocizzare l'analisi.
Quando si indica un numero minimo di occorrenze maggiore di 1, per una sotto-regola posta tra parentesi, oppure si indica un numero massimo di occorrenze, la fase di compila richiede più spazio in proporzione ai valori minimo e massimo.
Se un criterio inizia con .* oppure .{0,} e si è attivata l'opzione PCRE_DOTALL (euivalente al /s di Perl), permettendo al . di identificare il carattere di "a capo", si dice che il criterio è implicitamente ancorato, perché qualsiasi elemento che segue sarà confrontato con ciascun carattere della stringa oggetto della ricerca, e pertanto non vi è nessuna posizione, a parte la prima, da cui ripartire per ritentare il riconoscimento dell'intero criterio. PCRE tratta tale criterio come se fosse preceduto dalla sequenza \A. Nei casi in cui è noto a priori che la stringa oggetto di ricerca non contiene caratteri di "a capo", vale la pena di attivare l'opzione PCRE_DOTALL se il criterio di ricerca inizia con ".*", per ottenere questa ottimizzazione, oppure, in alternativa, usare "^" per indicare in modo esplicito un ancoraggio.
Quando si ripete una sotto-regola di cattura, il testo
estrapolato è la parte identificata dall'iterazione finale. Ad esempio se il criterio
(tweedle[dume]{3}\s*)+
viene applicato al testo "tweedledum tweedledee", il testo
estrapolato sarà "tweedledee". Tuttavia se vi sono delle
sotto-regole annidate, il testo catturato può essere
determinato dalle iterazioni precedenti. Ad esempio nel
criterio
/(a|(b))+/
applicato a "aba", la seconda stringa catturata è
"b".