Successivo: , Precedente: , Su: Espressioni regolari   [Contenuti][Indice]


3.3 Operatori di espressioni regolari

È possibile inserire in espressioni regolari dei caratteri speciali, detti operatori di espressioni regolari o metacaratteri, per aumentarne il potere e la versatilità.

Le sequenze di protezione descritte prima in Sequenze di protezione sono valide all’interno di una regexp. Sono precedute da una ‘\’ e sono riconosciute e convertite nei caratteri reali corrispondenti nella primissima fase dell’elaborazione delle regexp.

Ecco una lista dei metacaratteri. Tutti i caratteri che non sono sequenze di protezione e che non sono elencati qui rappresentano se stessi:

\

Si usa per togliere il significato speciale a un carattere quando si effettuano confronti. Per esempio, ‘\$’ individua il carattere ‘$’.

^

Si usa per indicare l’inizio di una stringa. Per esempio, ‘^@chapter’ individua ‘@chapter’ all’inizio di una stringa e si può usare per identificare inizi di capitoli in file sorgenti Texinfo. Il simbolo ‘^’ è conosciuto come àncora, perché àncora la ricerca solo all’inizio della stringa.

È importante notare che ‘^’ non individua un inizio di riga (il punto subito dopo un ritorno a capo ‘\n’) che si trovi all’interno di una stringa. La condizione non è verificata nell’esempio seguente:

if ("riga1\nRIGA 2" ~ /^R/) …
$

Simile a ‘^’, ma serve a indicare la fine di una stringa. Per esempio, ‘p$’ individua un record che termina con la lettera ‘p’. Il ‘$’ è un’àncora e non individua una fine di riga (il punto immediatamente prima di un carattere di ritorno a capo ‘\n’) contenuta in una stringa. La condizione nell’esempio seguente non è verificata:

if ("riga1\nRIGA 2" ~ /1$/) …
. (punto)

Individua un qualsiasi carattere, incluso il carattere di ritorno a capo. Per esempio, ‘.P’ individua ogni carattere in una stringa che sia seguito da una ‘P’. Usando la concatenazione, si può formare un’espressione regolare come ‘U.A’, che individua qualsiasi sequenza di tre caratteri che inizia con ‘U’ e finisce con ‘A’.

In modalità POSIX stretta (vedi Opzioni), ‘.’ non individua il carattere NUL, ossia il carattere con tutti i bit uguali a zero. In altri contesti, NUL è solo un carattere qualsiasi. Altre versioni di awk possono non essere in grado di individuare il carattere NUL.

[]

Questa è chiamata una espressione tra parentesi quadre.15 Individua uno qualsiasi dei caratteri racchiusi tra parentesi quadre. Per esempio, ‘[MVX]’ individua uno qualsiasi dei caratteri ‘M’, ‘V’, o ‘X’ in una stringa. Una spiegazione esauriente di quel che si può mettere all’interno di un’espressione tra parentesi quadre è data in Espressioni tra parentesi quadre.

[^]

Questa è una espressione tra parentesi quadre complementata. Il primo carattere dopo la ‘[deve essere un ‘^’. Individua qualsiasi carattere tranne quelli tra parentesi quadre. Per esempio, ‘[^awk]’ individua qualsiasi carattere che non sia una ‘a’, ‘w’, o ‘k’.

|

Questo è un operatore alternativa ed è usato per specificare delle alternative. La ‘|’ ha la precedenza più bassa tra tutti gli operatori di espressioni regolari. Per esempio, ‘^P|[aeiouy]’ individua tutte le stringhe corrispondenti a ‘^P’ oppure a ‘[aeiouy]’. Ciò significa che individua qualsiasi stringa che inizi con ‘P’ o contenga (in qualsiasi posizione al suo interno) una vocale inglese minuscola.

L’alternativa si applica alle regexp più ampie individuabili in ogni lato.

()

Le parentesi sono usate per raggruppare, sia nelle espressioni regolari sia in quelle aritmetiche. Si possono usare per concatenare espressioni regolari che contengono l’operatore alternativa, ‘|’. Per esempio, ‘@(samp|code)\{[^}]+\}’ individua sia ‘@code{pippo}’ sia ‘@samp{pluto}’. (Queste sono sequenze in linguaggio Texinfo per controllare la formattazione. Il significato di ‘+’ è spiegato più avanti in questa lista.)

*

Questo simbolo richiede che la precedente espressione regolare sia ripetuta tante volte quanto serve per trovare una corrispondenza. Per esempio, ‘ph*’ applica il simbolo ‘*’ al carattere ‘h’ che lo precede immediatamente e ricerca corrispondenze costituite da una ‘p’ seguita da un numero qualsiasi di ‘h’. Viene individuata anche solo la ‘p’, se non ci sono ‘h’.

Ci sono due sfumature da capire sul funzionamento di ‘*’. Primo, ‘*’ tiene conto solo del singolo componente dell’espressione regolare che lo precede (p.es., in ‘ph*’ vale solo per ‘h’). Per fare sì che ‘*’ si applichi a una sottoespressione più estesa, occorre metterla tra parentesi: ‘(ph)*’ individua ‘ph’, ‘phph’, ‘phphph’ e così via.

Secondo, ‘*’ trova quante più ripetizioni siano possibili. Se il testo da ricercare è ‘phhhhhhhhhhhhhhooey’, ‘ph*’ individua tutte le ‘h’.

+

Questo simbolo è simile a ‘*’, tranne per il fatto che l’espressione precedente deve essere trovata almeno una volta. Questo significa che ‘wh+y’ individuerebbe ‘why’ e ‘whhy’, ma non ‘wy’, mentre ‘wh*y’ li troverebbe tutti e tre.

?

Questo simbolo è simile a ‘*’, tranne per il fatto che l’espressione che precede può essere trovata una volta sola oppure non trovata affatto. Per esempio, ‘fe?d’ individua ‘fed’ e ‘fd’, ma nient’altro.

{n}
{n,}
{n,m}

Uno o due numeri tra parentesi graffe rappresentano una espressione di intervallo. Se c’è un numero tra graffe, la regexp precedente è ripetuta n volte. Se ci sono due numeri separati da una virgola, la regexp precedente è ripetuta da n a m volte. Se c’è un numero seguito da una virgola, allora la regexp precedente è ripetuta almeno n volte:

wh{3}y

Riconosce ‘whhhy’, ma non ‘why’ o ‘whhhhy’.

wh{3,5}y

Riconosce soltanto ‘whhhy’, ‘whhhhy’, o ‘whhhhhy’.

wh{2,}y

Riconosce ‘whhy’, ‘whhhy’ e così via.

Le espressioni di intervallo non erano tradizionalmente disponibili in awk. Sono state aggiunte come parte dello standard POSIX per rendere awk ed egrep coerenti tra di loro.

In passato, poiché vecchi programmi possono usare ‘{’ e ‘}’ in costanti regexp, gawk non riconosceva espressioni di intervallo nelle regexp.

Comunque, a partire dalla versione 4.0, gawk riconosce espressioni di intervallo per default. Ciò accade perché la compatibilità con POSIX è ritenuta più importante da molti utenti gawk rispetto alla compatibilità con dei vecchi programmi.

Per programmi che usano ‘{’ e ‘}’ in costanti regexp, è buona pratica proteggerli sempre con una barra inversa. Allora le costanti regexp sono valide e si comportano come desiderato, usando qualsiasi versione di awk.16

Infine, quando ‘{’ e ‘}’ appaiono in costanti regexp in un modo non interpretabile come espressione di intervallo (come in /q{a}/), allora sono prese letteralmente.

Nelle espressioni regolari, gli operatori ‘*’, ‘+’, e ‘?’, come pure le parentesi graffe ‘{’ e ‘}’, hanno la precedenza più alta, seguiti dalla concatenazione, e infine da ‘|’. Come nell’algebra, le parentesi possono cambiare il raggruppamento degli operatori. In POSIX awk e in gawk, gli operatori ‘*’, ‘+’, e ‘?’ rappresentano se stessi quando non c’è nulla nella regexp che li precede. Per esempio, /+/ individua un semplice segno più. Comunque, molte altre versioni di awk trattano una simile notazione come un errore di sintassi.

Se gawk è in modalità compatibile (vedi Opzioni), le espressioni di intervallo non si possono usare nelle espressioni regolari.


Note a piè di pagina

(15)

In altri testi, un’espressione tra parentesi quadre potrebbe essere definita come insieme di caratteri, classe di caratteri o lista di caratteri.

(16)

È meglio usare due barre inverse se si sta usando una costante stringa con un operatore regexp o una funzione.


Successivo: , Precedente: , Su: Espressioni regolari   [Contenuti][Indice]