Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

MySQL e Regular Expression

Introduzione alle espressioni regolare e MySQL: cosa sono le espressioni regolari e come possono essere utilizzate all'interno della sintassi SQL di MySQL
Introduzione alle espressioni regolare e MySQL: cosa sono le espressioni regolari e come possono essere utilizzate all'interno della sintassi SQL di MySQL
Link copiato negli appunti

Le espressioni regolari, chiamate in inglese regular expression e spesso abbreviate in regexp, regex o RE, sono delle sintassi attraverso cui e possibile rappresentare degli insiemi di stringhe tramite operatori, costanti e simboli denominati metacaratteri. Le espressioni regolari vengono impiegate in tantissimi programmi di utilizzo comune; si pensi per esempio agli editor di testo: grazie ad esse queste applicazioni sono in grado di effettuare operazioni come la ricerca o la sostituzione di stringhe. Nello stesso modo è possibile utilizzare le espressioni regolari all'interno delle interrogazioni verso un DBMS come MySQL, in particolare nelle query di selezione ed estrazione dei dati.

Nel corso di questa breve trattazione vedremo come sia possibile integrare le espressioni regolari nelle istruzione i nei comandi SQL e quali sono i metacaratteri supportati per la formulazione delle interrogazioni.

Espressioni regolari e interrogazioni

Immaginiamo di dover gestire un database destinato all'archiviazione di nominativi e recapiti, molto probabilmente avremo a disposizione una tabella (che potrebbe essere chiamata per esempio "agenda") in cui è presente un campo "nome" destinato a contenere il dato relativo al nome di battesimo delle identità archiviate.

Immaginiamo ora di voler estrarre da quella stessa tabella tutti i nomi inizianti per una determinata lettera dell'alfabeto come ad esempio la "L"; un semplice utilizzo delle espressioni regolari per ottenere il risultato voluto potrebbe essere il seguente:

SELECT nome FROM agenda WHERE nome REGEXP '^L'

Analizziamo nel dettaglio la nostra semplice interrogazione:

  • Si tratta di una comune query di selezione su un singolo campo, gli unici records coinvolti saranno quelli relativi al campo "nome" della tabella "agenda";
  • Non abbiamo bisogno di estrarre tutti i volori memorizzati attraverso il campo "nome" ma solo di una specifica parte di essi, utilizzeremo quindi la clausola WHERE per introdurre la nostra condizione;
  • REGEXP non è altro che una funzione, esattamente come altre utilizzate comunemente nel linguaggio SQL tra cui per esempio LIKE;
  • Nello specifico REGEXP è una funzione per il pattern matching, il suo compito è quello di ricercare delle sottostringhe all'interno di testi o stringhe principali;
  • Alla funzione viene passato come argomento una sottostringa detta "pattern" composta da un set di caratteri sulla base del quale dovrà essere effettuata la selezione;
  • Il carattere ^ indica che la ricerca dovrà limitarsi ad estrarre tutti i nomi che cominciano con il successivo carattere del pattern che nel nostro caso è "L",
  • Il pattern non specifica ulteriori regole, i nomi estratti potranno contenere qualsiasi carattere dopo la "L" e potranno essere di qualsiasi lunghezza, l'unico vincolo è la consonante iniziale.

Nello stesso modo avremmo potuto effettuare un'estrazione dei nomi inizianti con una consonante differente o con una vocale; dall'esempio appena esposto ricaviamo un semplice schema che sintetizza la sintassi alla base delle espressioni regolari:

SELECT nomeCampo FROM Tabella WHERE nomeCampo REGEXP "pattern";

Il grande vantaggio nell'utilizzo delle espressioni regolari sta nel fatto che esse permettono di utilizzare svariate tipologie di patterns, in questo modo sarà possibile digitare istruzioni sempre più precise e limitare gli output delle interrogazioni soltanto ai risultati desiderati senza dover ricorrere a lunghe queries strapiene di clausole AND e OR, cosa che per esempio non sempre è possibile con le funzioni destinate alla ricerca.

Analizziamo un secondo esempio riferito alla nostra tabella "Agenda": potrebbe infatti presentarsi la necessità di estrarre i nomi relativi a più di un'iniziale, ad esempio potremmo voler estrarre tutti i nomi che iniziano per "U", "V" e "Z"; in questo caso l'istruzione precedentemente esposta dovrà subire delle modifiche:

SELECT nome FROM agenda WHERE nome REGEXP '^(U|V|Z)'

Anche in questo secondo caso, la sottostringa utilizzata per il pattern matching inizia con il metacarattere "^" che indica quale dovrà essere il primo carattere della stringa da estrarre; questa volta però le iniziali sono più di una e per questo motivo è necessario delimitarle all'interno di parentesi tonde; utilizzeremo poi "|" per separare le tre iniziali in modo da indicare che ognuna di esse è un termine di confronto a sé stante (alternativa).

Cosa fare invece se si desidera utilizzare le espressioni regolari per ricercare stringhe che terminano con un determinato carattere? In questo caso si deve utilizzare il simbolo "$" che seguirà alla lettera utilizzata per effettuare la selezione; facciamo un semplice esempio:

SELECT nome FROM agenda WHERE nome REGEXP 'o$'

L'interrogazione proposta causerà l'estrazione di tutti i nomi presenti in agenda che terminano con la lettera "o".

I metacaratteri

Negli esempi proposti in precedenza abbiamo utilizzato all'interno delle interrogazioni alcuni metacaratteri come "$" e "^" descrivendone la funzione e le modalità di utilizzo; il nostro prossimo compito sarà quello di elencare alcuni dei metacaratteri più utilizzati nella formulazione delle query:

  • * : trova zero o più istanze della stringa che la precede;
  • + : trova una o più istanze della stringa che la precede;
  • ? : trova zero o una istanza della stringa che la precede;
  • . : trova ogni singolo carattere;
  • [xyz] : trova un qualsiasi carattere tra x, y, o z;
  • [^xyz] : trova un qualsiasi carattere che non sia x, y, o z;
  • [A-Z] : trova qualsiasi carattere alfabetico maiuscolo;
  • [a-z] : trova qualsiasi carattere alfabetico minuscolo;
  • [0-9] : trova qualsiasi numero;
  • {n,m} : indica che una stringa dovrà ricorrere almeno n volte ma non più di m volte;
  • {n} : indica che una stringa dovrà ricorrere esattamente n volte;
  • {n,} : indica che una stringa dovrà ricorrere almeno n volte;
  • [[:<:]] : trova l'inizio di una stringa;
  • [[:>:]] : trova la fine di una stringa;
  • [:class:] : trova i caratteri per classi come ad esempio:
  • [:alpha:] per le lettere;
  • [:space:] per gli spazi bianchi;
  • [:punct:] per i segni di interpunzione;
  • [:upper:] per le lettere minuscole.

Uso combinato dei metacaratteri nelle interrogazioni

Come abbiamo sottolineato in precedenza, la possibilità di combinare tra loro metacaratteri consente di aumentare la precisione delle nostre interrogazioni; nell'esempio che segue mostreremo una breve query grazie alla quale sarà possibile ricercare all'interno della nostra tabella tutti i valori che iniziano per la lettera "a" e che finiscono con la lettera "o":

SELECT nome FROM agenda WHERE nome REGEXP "^a.+o$";

Analizziamo il pattern passato come argomento a REGEXP:

  • "^a" indica che dovranno essere estratti soltanto i nomi che iniziano per "a";
  • il punto (".") impone la ricerca di qualsiasi tipo di carattere;
  • "+" indica che un carattere può essere presente una o più volte;
  • "o$" impone la "o" come lettera finale dei valori estratti.

L'interrogazione sarà in grado di restituire risultati come "angelo", "Angelo", ANGELO o "Ambrogio" ma non valori come "ao", il pattern richiede infatti che la stringa cercata presenti almeno un altro carattere tra la lettera iniziale e quella finale.

Le espressioni regolari potranno poi essere utilizzate per la ricerca di parole esatte all'interno di testi anche molto lunghi; nell'esempio che segue mostriamo come sia possibile estrarre tutte le ricorrenze della parola "cugino" all'interno di un campo destinato a contenere una descrizione

SELECT descrizione FROM agenda WHERE descrizione REGEXP '[[:<:]]cugino[[:>:]]'

Vediamo ora un ulteriore esempio: digiteremo un'interrogazione in cui verrà richiesta l'estrazione di valori che iniziano, contengono e finiscono con dei numeri:

SELECT anni FROM agenda WHERE anni REGEXP '^[0-9]+$'

La sintassi utilizzata non si differenzia di molto rispetto a quella precedentemente impiegata introducendo pattern alfabetici, la ricerca di numeri viene infatti effettuata seguendo le stesse modalità utilizzata per le lettere (anche i numeri sono caratteri).

Da sottolineare il fatto che MySQL interpreta il carattere backslash () come un carattere di escape, per utilizzare il backslash all'interno di istruzioni contenenti espressioni regolari è quindi necessario effettuare l'escape con un ulteriore backslash ("\").

Conclusioni

Le espressioni regolari ci consentono di formulare interrogazioni anche molto complesse attraverso un linguaggio simbolico strutturato in metacaratteri; la conoscenza approfondita dei metacaratteri e delle numerose possibilità di combinazione tra di essi consentono di ottenere ouput precisi e circostanziati attraverso semplici istruzioni e con un utilizzo minimo degli operatori.

Ti consigliamo anche