Questo documento sfrutta i fogli di stile (CSS); senza il supporto dei fogli di stile, benché il testo sia comunque visualizzabile, non saranno visibili ne le formattazioni ne la struttura della pagina.

Sommario   Precedente   Successivo

Introduzione alle espressioni regolari

La ripetizione delle corrispondenze

  1. La ripetizione delle corrispondenze
    1. Concetto di ripetizione
    2. Il metacarattere asterisco *
    3. La più lunga corrispondenza partendo da sinistra
    4. I metacaratteri \{n\}, \{n,\} E \{n,m\}

Concetto generale di ripetizione

I caratteri semplici e i metacaratteri . e [], sono elementi di base di un pattern, attraverso cui ricercare, nella stringa di input, un singolo carattere in una determinata posizione.

I metacaratteri trattati qui di seguito, invece servono a definire una corrispondenza ripetuta dell'elemento di base che immediatamente lo precede nel pattern.

Il metacarattere asterisco *

Il metacarattere * specifica che l'elemento di base che lo precede nel pattern potrà essere ripetuto 0 o più volte nella stringa di input.
In pratica è come se dicessi al motore di regexp, che, a partire da quella posizione, l'elemento di base a cui l'asterisco si riferisce può esserci o può non esereci, e se c'è può essere ripetuto più volte.

Esempio: Ripetizione dei caratteri semplici
ab*c
aa*

Oltre che i caratteri semplici l'asterisco può essere posto dopo altri elementi di base, come il metacarattere . ed il metacarattere [].
Nel primo caso, la corrispondenza sarà verificata per 0 o più caratteri qualsiasi con esclusione del newline.
Nel secondo caso invece, la corrispondenza sarà verificata per 0 o più caratteri fra quelli indicati nell'elenco, cioè all'interno delle parentesi quadre.

Esempio: La ripetizione con i metacaratteri punto ed elenco
ca[st][st]*.*

La ripetizione di più caratteri di un elenco realizza la corrispondenza indipendentemente da quale sia il carattere ripetuto, purchè esso faccia parte dell'elenco.
Il pattern c[st]* realizza la corrispondenza per tutte le seguenti sottostringhe:
cssssssssss, ctttttttttt, c, cs, ct, csst, ctsst, cstst, cttttsssts ecc.

L'espressione regolare .* utilizzata in modo isolato ricerca 0 o più caratteri qualsiasi con esclusione del newline; in pratica corrisponde all'intera stringa di input.
Probabilmente è più utile utilizzare il costrutto .* come parte di una regexp più complessa, all'interno di una sequenza in cui il costrutto precedente e quello successivo a .* fungono da delimitatori.

Esempio: Sottostringhe delimitate
".*"

In tal caso da delimitatori fungono i caratteri di doppi apici, ma essi possono essere qualsiasi altro carattere o perfino una qualsiasi sottostringa selezionabile attraverso un costrutto regexp.

@[1-9]@.*@[1-9]@

In tal caso da delimitatore non funge un singolo carattere, ma una sottostringa descritta dal costrutto regexp @[1-9]@.

La più lunga corrispondenza partendo da sinistra

Quando si usano i metacaratteri di ripetizione bisogna tenere conto del fatto che il motere di regexp ricerca la più lunga corrispondenza possibile partendo da sinistra.
Come base della spiegazione utilizzerò il pattern ".*", mostrando i risultati che si ottengono con diverse stringhe di input.

La regola della più lunga corrispondenza partendo da sinistra vale per tutti i metacaratteri di ripetizione.

Per selezionare esattamente il testo della stringa di input delimitato da uno specifico carattere, o da una specifica sottostringa, considerando la regola della più lunga corrispondenza, dobbiamo trovare una soluzione diversa da ".*" (in tal caso il carattere che funge da delimitatore è ").

Esempio: Un nuovo pattern per selezionare sottostringhe delimitate
"[^"]*"

Se applichiamo tale pattern alla stringa di input hjeksl" dasda "sdasda"ciao"dfg, otteniamo come risultato le sottostringhe " dasda " e "ciao".
La sottostringa che funge da delimitatore deve essere esclusa dalla ripetizione: [^delimiter]* (delimiter rappresenta la sottostringa che funge da delimitazione).

I metacaratteri composti \{n\}, \{n,\} e \{n,m\}

Tutti e tre i tipi di metacaratteri fanno parte della categoria dei metacaratteri di ripetizione dell'elemento di base che, nel pattern, li precede.

Tutti e tre consentono di specificare un determinato numero di ripetizioni dell'elemento di base precedente; n ed m sono infatti dei numeri interi che indicano quante volte l'elemento precedente deve essere ripetuto.

Il backslash \ che precede sia la parentesi aperta che quella chiusa, serve per attribuire il significato di metacarattere di ripetizione; senza il backslash le parentesi graffe sarebbero considerate caratteri semplici che corrispondono solo a se stessi.

Il metacarattere \{n\} fa si che l'elemento di base precedente deve essere ripetuto nella stringa di input esattamente n volte, ne una di più ne una di meno.

Esempio: Ripetizione di un numero fisso di volte
[1-9]\{3\}

Il metacarattere \{n,\} fa si che l'elemento di base precedente deve essere ripetuto nella stringa di input almeno n volte.

Esempio: Ripetizione di un minimo di volte
[1-9]\{3,\}

Il metacarattere \{n,m\} fa si che l'elemento di base precedente deve essere ripetuto nella stringa di input almeno n volte, ma non più di m volte.

Esempio: Ripetizione da un minimo a un massimo di volte
[1-9]\{3,5\}

I metacaratteri qui trattati, proprio perché consentono di rilevare ripetizioni precise di uno o più caratteri, sono utili per le ricerche in file di testo che sono costruiti come record con campi a lunghezza fissa.