Successivo: , Precedente: , Su: regexp Perl   [Contenuti][Indice]


B.6 Ripetizione

Una ripetizione è specificata da quantificatori, che possono essere posti dopo ognuno dei seguenti elementi:

Il quantificatore generale di ripetizione specifica un numero minimo e massimo di corrispondenze consentite, mettendo questi due numeri fra parentesi graffe, separati da una virgola. I numeri devono essere inferiori a 65536, e il primo dev’essere inferiore o uguale al secondo. Per esempio:

z{2,4}

corrisponde a ‘zz’, ‘zzz’, o ‘zzzz’. Una parentesi graffa chiusa non è in se stessa un carattere speciale. Se il secondo numero è omesso, ma la virgola è presente, non c’è un limite superiore; se il secondo numero e la virgola sono entrambi omessi, il quantificatore specifica il numero esatto di corrispondenze richieste. Quindi

[aeiou]{3,}

corrisponde ad almeno 3 vocali successive, ma può corrispondere anche a molte più vocali, mentre

\d{8}

corrisponde esattamente a 8 cifre. Una parentesi graffa aperta che appaia in una posizione in cui un quantificatore non è ammesso, o una che non rispetti la sintassi di un quantificatore, è considerata come un carattere normale. Per esempio {,6} non è un quantificatore, ma una stringa letterale di quattro caratteri.14

Il quantificatore ‘{0}’ è consentito, e fa sì che l’espressione si comporti come se il precedente elemento e il quantificatore non fossero presenti.

Per comodità, (e per compatibilità col passato) i tre quantificatori più comunemente usati hanno abbreviazioni lunghe un solo carattere:

*

è equivalente a {0,}

+

è equivalent a {1,}

?

è equivalente a {0,1}

È possibile costruire cicli infiniti specificando una sotto-espressione che può essere soddisfatta da 0 caratteri con un quantificatore che non abbia un limite superiore, per esempio:

(a?)*

Precedenti versioni di Perl davano un errore al momento della compilazione, per espressioni di questo tipo. Comunque, poiché ci sono casi in cui esse possono tornare utili, tali espressioni sono ora ammesse, ma se nessuna ripetizione della sotto-espressione corrisponde ad alcun carattere, il ciclo viene forzatamente interrotto.

Per impostazione predefinita, i quantificatori sono greedy (avidi) come in modalità POSIX, ossia trovano la corrispondenza più lunga possibile (fino al limite massimo di ripetizioni consentite), senza rendere invalido il resto dell’espressione. L’esempio classico di dove ciò può causare problemi è quello del tentativo di isolare commenti all’interno dei programmi C. I commenti C appaiono fra le stringhe /* e */ e all’interno dei commenti possono apparire dei caratteri singoli * e /. Un tentativo di trovare i commenti C usando l’espressione regolare

/\*.*\*/

esaminando la stringa

/* primo commento */ non commento /* secondo commento */

fallisce, perché viene trovata una corrispondenza con l’intera stringa, a causa dell’avidità dell’elemento .*.

Comunque, se un quantificatore è seguito da un punto interrogativo, cessa di essere avido (greedy) e corrisponde invece al numero minimo di volte possibili, e quindi l’espressione regolare /\*.*?\*/ agisce come desiderato con i commenti del C. Il significato dei vari quantificatori non è cambiato in altri modi, varia solo il numero preferito di corrispondenze. Non si deve confondere quest’uso del punto interrogativo con l’uso dello stesso come quantificatore in se stesso. Poiché l’uso può essere doppio, talora esso appare due volte, come in

\d??\d

che corrisponde preferibilmente a una cifra, ma può corrispondere a due cifre se il resto dell’espressione regolare lo richiede.

Si noti che l’avidità non ha importanza quando si specificano degli indirizzi, ma può essere comunque usata per migliorare le prestazioni.

Quando una sotto-espressione fra parentesi è quantificata con un contatore minimo di ripetizione maggiore di 1, oppure con un massimo limitato, più memoria è richiesta per l’espressione regolare compilata, in proporzione alla dimensioni del minimo o del massimo.

Se un’espressione regolare inizia con .* o .{0,} e si usa il modificatore S, l’espressione è implicitamente ancorata, perché qualsiasi cosa venga dopo verrà confrontata con i caratteri in qualsiasi posizione della stringa in esame, per cui non ha senso ricominciare a provare di nuovo l’espressione regolare in ogni posizione che segue la prima. PCRE tratta una tale espressione regolare come se fosse preceduta da \A.

Quando una sotto-espressione di cattura è ripetuta, il valore catturato è la sotto-stringa che soddisfa l’ultima ripetizione. Per esempio, dopo che

(tweedle[dume]{3}\s*)+

ha trovato ‘tweedledum tweedledee’ il valore della sotto-stringa catturata è ‘tweedledee’. Comunque, se ci sono delle sotto-espressioni nidificate, i valori catturati corrispondenti possono essere stati impostati in ripetizioni precedenti. Per esempio dopo che

/(a|(b))+/

trova la corrispondenza ‘aba’, il valore della seconda sotto-stringa catturata è ‘b’.


Note a piè di pagina

(14)

Genera una segnalazione di errore se non si usa l’opzione -R.


Successivo: , Precedente: , Su: regexp Perl   [Contenuti][Indice]