dal 2015 - visita n. 654
Espressioni Regolari
Espressioni Regolari

 

Espressioni Regolari

Uno dei problemi che spesso si presentano nella scrittura dei programmi per il web è quello del confronto di stringhe. Quando l'utente digita dei dati può essere necessario controllarne il contenuto; le regole della buona programmazione suggeriscono che questo tipo di controllo deve essere:

Esiste un potente algoritmo simbolico, il cui uso è ormai divenuto uno standard, che permette di rappresentare intere famiglie di stringhe, semplificando dunque le operazioni di confronto/ricerca/sostituzione, si tratta delle cosiddette Espressioni Regolari. Chiamate anche regex, esse costituiscono uno strumento per la ricerca di una data stringa di testo che fornisce tutte le varianti accettabili della stessa stringa. In questo modo è possibile fare ricerche avanzate risparmiando moltissimo tempo nel caso di testi particolarmente lunghi.

Aggiungono potenza e flessibilità ai normali metodi degli oggetti String per la ricerca e sostituzione consentendo la sostituzione automatica di tutte le occorrenze di una certa sequenza di caratteri in base ad una regola, anche piuttosto complessa, anzichè alla ricerca di una stringa preassegnata.

Il loro impiego è previsto da molti linguaggi di programmazione e di script, tra cui PHP, Perl, MATlab, e molte shell come Bash; esse trovano applicazione anche al di fuori della programmazione, ad esempio negli editor di testo. Naturalmente l'interprete (parser) delle espressioni regolari è differente, sia pur in minima parte, da linguaggio a linguaggio.

Il primo impatto può rivelarsi ostico, infatti questo pseudo-linguaggio di programmazione usa simboli e sequenze di caratteri di controllo che possono risultare piuttosto criptici, ma che sono abbastanza familiari invece per coloro che conoscono Perl o Bash. Un classico esempio d'uso di espressione regolare si presenta quando occorre verificare la consistenza di un indirizzo email la cui struttura canonica è composta da username, dominio del sito, estensione (legati dai caratteri "@" e "."):

username@dominio.ext

In una espressione regolare gioca un ruolo fondamentale lo schema della stringa da trattare, il cosiddetto pattern, che viene descritto da una sequenza di caratteri di controllo che può essere dichiarata con una delle due sintassi seguenti:

var patt = /.../modo;
var patt = new RegExp("...","modo");

dove abbiamo supposto, per semplicità, che il nostro pattern d'esempio sia rappresentato da tre puntini (...). Il parametro modo specifica la modalità della ricerca: globale, sensibile alle maiuscole, etc. Le due metodologie sono equivalenti anche se negli esempi che seguiranno utilizzeremo spesso la prima delle due sintassi, che prevede l'uso della coppia di caratteri slash ("/"). Con la seconda sintassi viene evidenziato l'aspetto oggetto dell'operatore RegExp.


Caratteri Speciali

Per costruire le espressioni regolari vengono utilizzati dei caratteri speciali, che non identificano il particolare carattere, ma rappresentano altri caratteri o gruppi di caratteri. La tabella seguente fornisce una descrizione e degli esempi:

CarattereRappresentaEsempio
.Un singolo carattere. rappresenta b, X
\dUn carattere numerico da 0 a 9\d\d\d rappresenta una sequenza di 3 cifre: 473
\DUn carattere non numerico\D rappresenta Z, %, r, ma non 3
\wUn carattere alfanumerico, incluso underscore [A-Z, a-z, 0-9, _]\w\w rappresenta A2, 3_, ma non d$ o ()
\WUn carattere non alfanumerico\w non Ripete 5, _, a
\sUn carattere di spaziatura (spazio, tab, nuova riga, ecc...)\s rappresenta tab, \n, ma non .
\SUn carattere non di spaziatura\S rappresenta "%", ma non " "
[...]Uno dei caratteri o intervalli di caratteri indicati tra le parentesi[ciao] rappresenta la c, la o, ma non la b; [0-9] equivale a \d, perché rappresenta i caratteri numerici 0..9
[^...]Uno dei caratteri o intervalli di caratteri non indicati tra le parentesi[^ciao] rappresenta la b, la q, ma non la c; [^a-z] rappresenta qualsiasi carattere non compreso tra a e z. Può rappresentare la @, ma non la k.

Caratteri di Ripetizione

I caratteri speciali possono, se necessario, trovarsi in sequenze ripetute. I seguenti caratteri servono per ottenere delle ripetizioni dei caratteri speciali in base a quanto indicato.

CarattereRipetizioneEsempio
{n}Ripete l'elemento precedente n volte\d{3} equivale a /d/d/d quindi rappresenta una sequenza di tre cifre.
{n,}Ripete l'elemento precedente n o più volte\w{2,} rappresenta ac, a4cr, a_4, ma non 4 o d4gsz%
{n, m}Ripete l'elemento precedente da un minimo di n volte a un massimo di m volte\d{3,5} rappresenta 223, 3566, ma non 04 o 692159
?Ripete l'elemento precedente zero o una voltaciao? rappresenta cia oppure ciao (il punto interrogativo agisce solo sul carattere che lo precede)
+Ripete l'elemento precedente una o più volteciao+ rappresenta ciao, ma anche ciaoooooo
*Ripete l'elemento precedente zero o più voltea* rappresenta sia una stringa vuota, sia a, ma anche aaaaa
.* rappresenta qualsiasi stringa (sia vuota, sia contenente caratteri speciali).

Caratteri di Posizione

Per completare gli strumenti utilizzati nella costruzione delle espressioni regolari bisogna, infine, citare l'esistenza di alcuni caratteri speciali che non specificano un particolare tipo di caratteri, ma una particolare posizione all'interno della stringa.

CaratterePosizioneEsempio
^Rappresenta l'inizio della stringa o, nel caso di stringhe su righe multiple, l'inizio di una riga.[*]^\d rappresenta una cifra numerica, ma solo se all'inizio della riga.
$Rappresenta la fine della stringa o, nel caso di stringhe su righe multiple, la fine di una riga.[*]\w$ rappresenta un carattere alfanumerico, ma solo se alla fine della riga.
\bRappresenta un limite di parola, cioè il punto tra la fine di una parola e il primo carattere di parolaa\b abbina a, ma solo se si trova alla fine di una parola. Questo può servire se si vuole abbinare solo una parola: \bparola\b.
\BRappresenta una posizione che non è un limite di parola\Ba\B abbina a, ma solo se si trova in mezzo ad una parola, non agli estremi
[*] Per lavorare con stringhe su più righe si deve impostare a true la proprietà multiline di RegExp:   myRegex.multiline = true;


... continua ...


















Introduzione
Variabili ed Operatori
Parole riservate
Codici Carattere
HTML e JavaScript
Funzioni
Strutture di controllo
Eventi
Oggetti
Oggetti predefiniti
Espressioni Regolari



Chi può amare è felice.
Hermann Hesse

Valid CSS!
pagina generata in 0.001 secondi