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


B.10 Sotto-espressioni condizionali

È possibile far sì che il processo di corrispondenza sia vincolato a una sotto-espressione in maniera condizionale o che si scelga fra due sotto-espressioni alternative, a seconda del risultato di una dichiarazione, oppure a seconda che una precedente sotto-espressione di cattura sia stata trovata oppure no. Le due forme possibili di una sotto-espressione condizionale sono

(?(condition)yes-pattern)
(?(condition)yes-pattern|no-pattern)

Se la condizione è soddisfatta, viene usato yes-pattern [la sotto-espressione regolare per il caso positivo]; altrimenti viene usato il no-pattern (se presente). Se ci sono più di due alternative nella sotto-espressione, una segnalazione di errore viene emessa in fase di compilazione.

Ci sono due tipi di condizione. Se il testo tra parentesi consiste in una sequenza di cifre, la condizione è soddisfatta se la sotto-espressione di cattura di quel numero è stata soddisfatta in precedenza. Il numero deve essere maggiore di zero. Si consideri la seguente espressione regolare, che contiene spazi bianchi non significativi per renderla più leggibile (si supponga che sia attivo il modificatore X) e per dividerla in tre parti per facilitarne la spiegazione:

( \( )?   [^()]+   (?(1) \) )

La prima parte corrisponde a una parentesi aperta opzionale, e se quel carattere è presente, viene impostato come la prima sotto-stringa catturata. La seconda parte corrisponde a uno o più caratteri che non siano parentesi. La terza parte è una sotto-espressione condizionale che controlla se il primo set di parentesi è stato trovato oppure no. Se è stato trovato, ossia se la stringa in esame inizia con una parentesi aperta, la condizione è verificata, e così si esegue lo yes-pattern, il che richiede la presenza di una parentesi chiusa. Altrimenti, poiché il no-pattern non è presente, la sotto-espressione non corrisponde a nulla. In altre parole, quest’espressione regolare corrisponde a una sequenza di non-parentesi, opzionalmente racchiuse fra parentesi.

Se la condizione non è una sequenza di cifre, dev’essere una dichiarazione. Questa può essere una dichiarazione positiva o negativa, rivolta in avanti o rivolta all’indietro. Si consideri quest’espressione regolare, che ancora contiene degli spazi bianchi non significativi e con le due alternative sulla seconda linea:

(?(?=...[a-z])
   \d\d-[a-z]{3}-\d\d |
   \d\d-\d\d-\d\d )

La condizione è una dichiarazione positiva rivolta in avanti che corrisponde a una lettera che si trova a tre caratteri di distanza dalla posizione corrente. Se una lettera viene trovata, la stringa in esame è controllata per trovare la prima alternativa ‘dd-aaa-dd’ (dove aaa sono lettere e dd sono cifre); altrimenti è controllata per trovare la seconda alternativa, ‘dd-dd-dd’.


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