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


3.4 Usare espressioni tra parentesi quadre

Come detto sopra, un’espressione tra parentesi quadre individua qualsiasi carattere incluso tra le parentesi quadre aperta e chiusa.

All’interno di un’espressione tra parentesi quadre, una espressione di intervallo è formata da due caratteri separati da un trattino. Individua ogni singolo carattere compreso tra i due caratteri, ordinati secondo l’insieme di caratteri in uso nel sistema. Per esempio, ‘[0-9]’ equivale a ‘[0123456789]’. (Si veda Intervalli regexp e localizzazione: una lunga e triste storia per una spiegazione di come lo standard POSIX e gawk sono cambiati nel corso degli anni. La cosa ha un interesse principalmente storico.)

Con la crescente popolarità dello standard di caratteri Unicode, c’è un’ulteriore dettaglio da tenere in conto. Le sequenze di protezione ottali ed esadecimali utilizzabili per inserire valori all’interno di espressioni tra parentesi quadre sono considerate contenere solo caratteri che occupano un unico byte (caratteri il cui valore stia nell’intervallo 0–256). Per individuare un intervallo di caratteri in cui i punti di inizio e fine dell’intervello abbiano valori maggiori di 256, occorre immettere direttamente le codifiche multi-byte dei caratteri in questione.

Per includere uno dei caratteri ‘\’, ‘]’, ‘-’, o ‘^’ in un’espressione tra parentesi quadre, occorre inserire un ‘\’ prima del carattere stesso. Per esempio:

[d\]]

individua sia ‘d’ che ‘]’. Inoltre, se si mette una ‘]’ subito dopo la ‘[’ aperta, la parentesi quadra chiusa è considerata come uno dei caratteri da individuare.

L’utilizzo di ‘\’ nelle espressioni tra parentesi quadre è compatibile con altre implementazioni di awk ed è anche richiesto da POSIX. Le espressioni regolari in awk sono un insieme più esteso delle specificazioni POSIX per le espressioni regolari estese (ERE). Le ERE POSIX sono basate sulle espressioni regolari accettate dal tradizionale programma di utilità egrep.

Le classi di caratteri sono una funzionalità introdotta nello standard POSIX. Una classe di caratteri è una particolare notazione per descrivere liste di caratteri cha hanno un attributo specifico, ma i caratteri veri e propri possono variare da paese a paese e/o da insieme di caratteri a insieme di caratteri. Per esempio, la nozione di cosa sia un carattere alfabetico è diversa tra gli Stati Uniti e la Francia.

Una classe di caratteri è valida solo in una regexp contenuta tra le parentesi quadre di un’espressione tra parentesi quadre. Le classi di caratteri consistono di ‘[:’, una parola chiave che segnala la classe, e ‘:]’. La Tabella 3.1 elenca le classi di caratteri definite dallo standard POSIX.

ClasseSignificato
[:alnum:]Caratteri alfanumerici.
[:alpha:]Caratteri alfabetici.
[:blank:]Caratteri spazio e TAB.
[:cntrl:]Caratteri di controllo.
[:digit:]Caratteri numerici.
[:graph:]Caratteri che sono stampabili e visibili. (Uno spazio è stampabile ma non visibile, mentre una ‘a’ è l’uno e l’altro.)
[:lower:]Caratteri alfabetici minuscoli.
[:print:]Caratteri stampabili (caratteri che non sono caratteri di controllo).
[:punct:]Caratteri di punteggiatura (caratteri che non sono lettere, cifre, caratteri di controllo, o caratteri di spazio).
[:space:]Caratteri di spazio (ovvero: spazio, TAB, avanzamento riga (newline), ritorno a capo (carriage return), avanzamento pagina (formfeed) e tabulazione verticale)
[:upper:]Caratteri alfabetici maiuscoli.
[:xdigit:]Caratteri che sono cifre esadecimali.

Tabella 3.1: classi di caratteri POSIX

Per esempio, prima dello standard POSIX, si doveva scrivere /[A-Za-z0-9]/ per individuare i caratteri alfanumerici. Se l’insieme di caratteri in uso comprendeva altri caratteri alfabetici, l’espressione non li avrebbe individuati. Con le classi di caratteri POSIX si può scrivere /[[:alnum:]]/ per designare i caratteri alfabetici e numerici dell’insieme di caratteri in uso.

Alcuni programmi di utilità che cercano espressioni regolari prevedono una classe di caratteri, non standard, ‘[:ascii:]’; awk non la prevede. Tuttavia, è possibile ottenere lo stesso risultato utilizzando ‘[\x00-\x7F]’. Quest’espressione individua tutti i valori numerici tra zero e 127, che è l’intervallo definito dell’insieme di caratteri ASCII. Usando una lista di caratteri che esclude (‘[^\x00-\x7F]’) si individuano tutti i caratteri mono-byte che non sono nell’intervallo ASCII.

NOTA: Alcune vecchie versioni Unix di awk trattano [:blank:] come [:space:], individuando quindi più caratteri del dovuto. Caveat Emptor! [Stia in guardia il compratore!].

In espressioni tra parentesi quadre possono apparire due ulteriori sequenze speciali. Riguardano insiemi di caratteri non-ASCII, che possono avere simboli singoli (chiamati elementi di collazione) che sono rappresentati con più di un carattere. Possono designare anche parecchi caratteri che sono equivalenti tra loro ai fini della collazione, o dell’ordinamento. (Per esempio, in francese, la semplice “e” e la sua versione con accento grave “è” sono equivalenti). Queste sequenze sono:

elementi di collazione

Elementi di collazione multi-byte racchiusi fra ‘[.’ e ‘.]’. Per esempio, se ‘ch’ è un elemento di collazione, ‘[[.ch.]]’ è una regexp che individua questo elemento di collazione, mentre ‘[ch]’ è una regexp che individua le lettere ‘c’ o ‘h’.

classi di equivalenza

Sono nomi, specifici a una particolare localizzazione, per una lista di caratteri equivalenti tra loro. Il nome è racchiuso fra ‘[=’ e ‘=]’. Per esempio, il nome ‘e’ potrebbe essere usato per designare “e”, “ê”, “è”, e “é”. In questo caso, ‘[[=e=]]’ è una regexp che corrisponde a ‘e’, ‘ê’, ‘è’ e ‘é’.

Queste funzionalità sono molto utili in localizzazioni non inglesi.

ATTENZIONE: Le funzioni di libreria che gawk usa per individuare le espressioni regolari per ora riconoscono solo le classi di caratteri POSIX; non riconoscono simboli di collazione o classi di equivalenza.

In un’espressione tra parentesi quadre, una parentesi aperta (‘[’) che non costituisca l’inizio della specificazione di una classe di caratteri, di simboli di collazione o di una classe di equivalenza è interpretata letteralmente. Questo vale anche per ‘.’ e ‘*’.


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