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


3.8 Fare confronti ignorando maiuscolo/minuscolo

Il tipo di carattere (maiuscolo/minuscolo) è normalmente rilevante nelle espressioni regolari, sia nella ricerca di caratteri normali (cioè, non metacaratteri), sia all’interno di espressioni fra parentesi. Quindi, una ‘w’ in un’espressione regolare individua solo una ‘w’ e non la corrispondente maiuscola ‘W’.

Il modo più semplice per richiedere una ricerca non sensibile al maiuscolo/minuscolo è di usare un’espressione tra parentesi quadre, per esempio ‘[Ww]’. Comunque, questo può essere pesante se si usa spesso, e può rendere le espressioni regolari di difficile lettura. Ci sono due alternative che potrebbero essere preferibili.

Un modo per fare un confronto non sensibile a maiuscolo/minuscolo in un particolare punto del programma è di convertire i dati in un solo tipo (o minuscole o maiuscole), usando le funzioni di stringa predefinite tolower() o toupper() (che non abbiamo ancora introdotto; vedi la sezione Funzioni di manipolazione di stringhe). Per esempio:

tolower($1) ~ /foo/  { … }

converte il primo campo in minuscole, prima di fare un confronto. Questo funziona in ogni awk conforme allo standard POSIX.

Un altro metodo, proprio di gawk, è di impostare la variabile IGNORECASE a un valore diverso da zero (vedi la sezione Variabili predefinite). Quando IGNORECASE è diverso da zero, tutte le operazioni con regexp e stringhe ignorano la distinzione maiuscolo/minuscolo.

Il cambio del valore di IGNORECASE controlla dinamicamente la sensibilità a maiuscolo/minuscolo del programma quando è in esecuzione. Il tipo di carattere (maiuscolo/minuscolo) è rilevante per default, poiché IGNORECASE (come la maggior parte delle variabili) è inizializzata a zero:

x = "aB"
if (x ~ /ab/) …   # questo test non risulterà verificato

IGNORECASE = 1
if (x ~ /ab/) …   # adesso sarà verificato

In generale, non è possibile usare IGNORECASE per rendere certe regole non sensibili a maiuscolo/minuscolo e altre regole invece sì, perché non c’è una maniera diretta per impostare IGNORECASE solo per l’espressione di una particolare regola.18 Per fare questo, si usino espressioni tra parentesi quadre oppure tolower(). Comunque, una cosa che si può fare con IGNORECASE soltanto è di utilizzare o di ignorare la sensibilità a maiuscolo/minuscolo per tutte le regole contemporaneamente.

IGNORECASE è impostabile dalla riga di comando o in una regola BEGIN (vedi la sezione Altri argomenti della riga di comando; e vedi la sezione Azioni di inizializzazione e pulizia). Impostare IGNORECASE dalla riga di comando è un modo per rendere un programma insensibile a maiuscolo/minuscolo senza doverlo modificare.

In localizzazioni multibyte, le equivalenze tra caratteri maiuscoli e minuscoli sono controllate usando i valori in formato esteso dell’insieme di caratteri della localizzazione. Prima della versione 5.0, i caratteri che usano un solo byte erano confrontati usando l’insieme di caratteri ISO-8859-1 (ISO Latin-1). Tuttavia, a partire dalla versione 5.0, i caratteri che usano un solo byte sono confrontati usando anche i valori dell’insieme di caratteri della localizzazione.19

Il valore di IGNORECASE non ha effetto se gawk è in modalità compatibile (vedi la sezione Opzioni sulla riga di comando). Il tipo di carattere (maiuscolo o minuscolo) è sempre rilevante in modalità compatibile.


Note a piè di pagina

(18)

Programmatori esperti in C e C++ noteranno che questo è possible, usando qualcosa come ‘IGNORECASE = 1 && /foObAr/ { … }’ e ‘IGNORECASE = 0 || /foobar/ { … }’. Comunque, questo è un po’ tortuoso e non è raccomandato.

(19)

Se questo sembra oscuro, non c’è ragione di preoccuparsi; significa solo che gawk fa la cosa giusta.


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