Skill Factory
Lista post > 5. Competenze per programmare: le espressioni regolari (REGEXP)
5. Competenze per programmare: le espressioni regolari (REGEXP)
Gino Visciano |
Skill Factory - 25/04/2024 10:55:56 | in Tutorials
Tra le attività svolte dai programmatori rientra anche quelle di controllare il formato dei dati, per verificare se corrispondono alle specifiche previste dal programma.
Ad esempio, il codice fiscale di una persona per essere corretto deve avere il formato seguente:
3 caratteri alfabetici per il cognome;
3 caratteri alfabetici per il nome;
2 caratteri numerici per l'anno di nascita;
1 carattere alfabetico per il mese di nascita;
2 caratteri numerici per il giorno di nascita ed il sesso;
4 caratteri associati al Comune oppure allo Stato estero di nascita;
1 carattere alfabetico usato come carattere di controllo.
Nei linguaggi di programmazione per controllare se il formato dei dati forniti al programma è corretto si usano le esperssioni regolari (regexp).
Le REGEXP sono stringhe che si costruiscono in base al tipo di formato da verificare; confrontando queste stringhe di formato, chiamate anche pattern, con la stringa che contiene l'informazione da controllare, si può verificare se il formato corrisponde.
Ad esempio, nel caso del codice fiscale di una persona, la stringa REGEXP da confrontare con il campo o la variabile che contiene il codice fiscale è la seguente:
^[A-Z]{6}[0-9]{2}[A-Z][0-9]{2}[A-Z][0-9]{3}[A-Z]$
Per creare un'espressione regolare su usano:
Ancore
Qualificatori
Classi
Modificatori
Caratteri speciali
Ancore
^ - identifica l'inizio della stringa;
$ - identifica la fine della stringa.
Ad esempio, la stringa REGEXP seguente:
^[A-Z]
verifica se all'inizio della stringa che stiamo controllando è presente una lettera alfabetica maiuscola, mentre:
[A-Za-z]$
verifica se alla fine della stringa che stiamo controllando è presente una lettera alfabetica maiuscola oppure minuscola.
Qualificatori
* - indica 0 o più ricorrenze;
+ - indica 1 o più ricorrenze;
? - indica 1 o 0 ricorrenze;
{n} - verifica esattamente n occorrenze;
{n,} - verifica minimo n occorrenze;
{n,m} - verifica esattamente minimo n occorrenze, massimo m.
Esempi:
La stringa REGEXP seguente:
[A-Z]+
verifica se la stringa inizia almeno con una lettera maiuscola, ma la stringa può contenere qualunque tipi di carattere.
La stringa REGEXP seguente:
^[A-Z]+$
verifica se la stringa conriene almeno con una lettera maiuscola, ma la stringa può essere composta solo da lettere miuscole.
^[A-Z]{6}
verifica se all'inizio della stringa che stiamo controllando sono presenti 6 lettere alfabetiche maiuscole.
La stringa REGEXP seguente:
[0-9]{3,5}$
verifica se alla fine della stringa che stiamo controllando ci sono almeno da 3 a 5 numeri.
Se togliamo l'ancora dall'espressione regolare:
[0-9]{3,5}
otteniamo che la stringa che stiamo controllando deve essere composta da 3 a 5 numeri.
Altri esempri:
* equivale a {0,}
+ equivale a {1,}
? equivale a {1,0}
[uno]{3} equivale ad una delle seguenti parole: uno, uon, nuo, nou, onu, oun.
Le classi determinano un elenco di caratteri, vengono racchiuse tra parentesi quadre e possono essere seguite dai quantificatori.
[0-9] una cifra da 0 a 9;
[0-9]+ almeno una cifra da 0 a 9;
[^0-9] qualunque carattere a parte i numeri;
[a-z] una lettera alfabetica minuscola;
[A-Z] una lettera alfabetica maiuscola;
[a-zA-Z] una lettera alfabetica minuscola o maiuscola;
[^a-zA-Z] qualunque carattere a parte le lettera alfabetica minuscole e maiuscole;
[0-9a-zA-Z] una lettera oppure un numero;
[0-9,]+ contiene almeno una cifra o una virgola.
Esempi:
La stringa REGEXP seguente:
[^0-9]+
verifica se la stringa inizia almeno con un carattere diverso da un numeo.
La stringa REGEXP seguente:
^[^0-9]+$
La stringa REGEXP seguente:
^[^0-9]*$
Modificatori
i - la verifica diventa case-insensitive, cioè maiuscole e minuscole vengono considerate uguali;
m - la verifica verrà considerate “per riga”, cioè le ancore tipo “^” e “$” verranno applicate per ogni riga di testo;
g - cerca tutte le ricorrenze e non solo la prima.
Caratteri speciali
. - corrisponde ad un carattere qualsiasi (ex. [.]{5} parola di cinque caratteri);
\. - indica il carattere punto;
\( - indica il carattere parentesi;
| - indica oppure (ex. [r|t] parola che contiene un solo carattere che può essere r oppure t);
\d - ricerca cifre numeriche, corrisponde a [0-9]+;
\D - non contiene cifre numeriche, corrisponde a [^0-9]+;
\t - ricerca tabulazione (TAB);
\n - ricerca fine riga (LF);
\r - ricerca ritorno a capo (CR);
\s - ricerca lo spazio;
\S - non contiene lo spazio;
\uxxx - ricerca il carattere indicato con il codice unicode xxx;
\w - ricerca qualsiasi carattere alfanumerico inclusi "_" e lo spazio, corrisponde a [0-9a-zA-Z_ ];
\W - ricerca qualsiasi carattere non alfanumerico, corrisponde a [^0-9a-zA-Z_ ].
Esempi:
La stringa REGEXP seguente:
La stringa REGEXP seguente:
verifica se la stringa alfanumerica contiene uno spazio.
verifica se la stringa alfanumerica non contiene spazi.
Esempio 1
Verificare se il valore della stringa è in formato euro:
Soluzione Python:
# Formato EURO
import re
stringa="12300,00"
formato="\d*(\.|\,)\d{2}"
if re.match(formato,stringa)!=None:
print(stringa+":Euro OK")
else:
print(stringa+":Euro NO")
stringa="12300.00"
if re.match(formato,stringa)!=None:
print(stringa+":Euro OK")
else:
print(stringa+":Euro NO")
stringa="12300,0"
if re.match(formato,stringa)!=None:
print(stringa+":Euro OK")
else:
print(stringa+":Euro NO")
stringa="123000"
if re.match(formato,stringa)!=None:
print(stringa+":Euro OK")
else:
print(stringa+":Euro NO")
----- OUTPUT -----
12300,00:Euro OK
12300.00:Euro OK
12300,0:Euro NO
123000:Euro NO
Soluzione JavaScript:
stringa = "12300,00"
formato = /\d*(\.|\,)\d{2}/
if (stringa.match(formato)) {
console.log(stringa + ":Euro OK")
} else {
console.log(stringa + ":Euro NO")
}
stringa = "12300.00"
if (stringa.match(formato)) {
console.log(stringa + ":Euro OK")
} else {
console.log(stringa + ":Euro NO")
}
stringa = "12300,0"
if (stringa.match(formato)) {
console.log(stringa + ":Euro OK")
} else {
console.log(stringa + ":Euro NO")
}
stringa = "123000"
if (stringa.match(formato)) {
console.log(stringa + ":Euro OK")
} else {
console.log(stringa + ":Euro NO")
}
----- OUTPUT -----
12300,00:Euro OK
12300.00:Euro OK
12300,0:Euro NO
123000:Euro NO
Esempio 2
Verificare se il valore della stringa è in formato data gg/mm/aaaa:
Soluzione Python:
# Formato DATA gg/mm/aaaa
import re
stringa="31/05/2024"
formato="(0[1-9]|[12][0-9]|3[01])[-/](0[1-9]|1[012])[-/](19|20)\d\d"
if re.match(formato,stringa)!=None:
print(stringa+":Data OK")
else:
print(stringa+":Data NO")
stringa="30/03/2024"
if re.match(formato,stringa)!=None:
print(stringa+":Data OK")
else:
print(stringa+":Data NO")
stringa="31-05-2024"
if re.match(formato,stringa)!=None:
print(stringa+":Data OK")
else:
print(stringa+":Data NO")
stringa="31-05-24"
if re.match(formato,stringa)!=None:
print(stringa+":Data OK")
else:
print(stringa+":Data NO")
stringa="31-05-2024"
if re.match(formato,stringa)!=None:
print(stringa+":Data OK")
else:
print(stringa+":Data NO")
stringa="32-05-2024"
if re.match(formato,stringa)!=None:
print(stringa+":Data OK")
else:
print(stringa+":Data NO")
stringa="31-15-2024"
if re.match(formato,stringa)!=None:
print(stringa+":Data OK")
else:
print(stringa+":Data NO")
----- OUTPUT -----
31/05/2024:Data OK
30/03/2024:Data OK
31-05-2024:Data OK
31-05-24:Data NO
31-05-2024:Data OK
32-05-2024:Data NO
31-15-2024:Data NO
Soluzione JavaScript:
stringa = "31/05/2024"
formato = /(0[1-9]|[12][0-9]|3[01])[-/](0[1-9]|1[012])[-/](19|20)\d\d/
if (stringa.match(formato, stringa)) {
console.log(stringa + ": Data OK")
} else {
console.log(stringa + ": Data NO")
}
stringa = "30/03/2024"
if (stringa.match(formato, stringa)) {
console.log(stringa + ": Data OK")
} else {
console.log(stringa + ": Data NO")
}
stringa = "31-05-2024"
if (stringa.match(formato, stringa)) {
console.log(stringa + ": Data OK")
} else {
console.log(stringa + ": Data NO")
}
stringa = "31-05-24"
if (stringa.match(formato, stringa)) {
console.log(stringa + ": Data OK")
} else {
console.log(stringa + ": Data NO")
}
stringa = "31-05-2024"
if (stringa.match(formato, stringa)) {
console.log(stringa + ": Data OK")
} else {
console.log(stringa + ": Data NO")
}
stringa = "32-05-2024"
if (stringa.match(formato, stringa)) {
console.log(stringa + ": Data OK")
} else {
console.log(stringa + ": Data NO")
}
stringa = "31-15-2024"
if (stringa.match(formato, stringa)) {
console.log(stringa + ": Data OK")
} else {
console.log(stringa + ":Data NO")
}
----- OUTPUT -----
31/05/2024: Data OK
30/03/2024: Data OK
31-05-2024: Data OK
31-05-24: Data NO
31-05-2024: Data OK
32-05-2024: Data NO
31-15-2024: Data NO
Esempio 3
Verificare se il nome utente è formato da soli caratteri alfanumerici minuscoli, più _ e – di lungezza min 3 e max 15
Soluzione Python:
# Nome utente è formato da soli caratteri alfanumerici minuscoli, più _ e – di lungezza min 3 e max 15
import re
nome="marco_"
formato="^[a-z0-9_-]{3,15}$"
if re.match(formato,nome)!=None:
print(nome+":Nome utente OK")
else:
print(nome+":Nome utente NO")
nome="Marco_"
if re.match(formato,nome)!=None:
print(nome+":Nome utente OK")
else:
print(nome+":Nome utente NO")
nome="paolo_rossi!"
if re.match(formato,nome)!=None:
print(nome+":Nome utente OK")
else:
print(nome+":Nome utente NO")
nome="paolo_rossi_01"
if re.match(formato,nome)!=None:
print(nome+":Nome utente OK")
else:
print(nome+":Nome utente NO")
nome="pr"
if re.match(formato,nome)!=None:
print(nome+":Nome utente OK")
else:
print(nome+":Nome utente NO")
nome="paolo_rossi_primo"
if re.match(formato,nome)!=None:
print(nome+":Nome utente OK")
else:
print(nome+":Nome utente NO")
nome="paolorossiprimo"
if re.match(formato,nome)!=None:
print(nome+":Nome utente OK")
else:
print(nome+":Nome utente NO")
----- OUTPUT -----
marco_:Nome utente OK
Marco_:Nome utente NO
paolo_rossi!:Nome utente NO
paolo_rossi_01:Nome utente OK
pr:Nome utente NO
paolo_rossi_primo:Nome utente NO
paolorossiprimo:Nome utente OK
Soluzione JavaScript:
nome = "marco_"
formato = /^[a-z0-9_-]{3,15}$/
if (nome.match(formato, nome)) {
console.log(nome + ":Nome utente OK")
}
else {
console.log(nome + ":Nome utente NO")
}
nome = "Marco_"
if (nome.match(formato, nome)) {
console.log(nome + ":Nome utente OK")
}
else {
console.log(nome + ":Nome utente NO")
}
nome = "paolo_rossi!"
if (nome.match(formato, nome)) {
console.log(nome + ":Nome utente OK")
}
else {
console.log(nome + ":Nome utente NO")
}
nome = "paolo_rossi_01"
if (nome.match(formato, nome)) {
console.log(nome + ":Nome utente OK")
}
else {
console.log(nome + ":Nome utente NO")
} nome = "pr"
if (nome.match(formato, nome)) {
console.log(nome + ":Nome utente OK")
}
else {
console.log(nome + ":Nome utente NO")
} nome = "paolo_rossi_primo"
if (nome.match(formato, nome)) {
console.log(nome + ":Nome utente OK")
}
else {
console.log(nome + ":Nome utente NO")
} nome = "paolorossiprimo"
if (nome.match(formato, nome)) {
console.log(nome + ":Nome utente OK")
}
else {
console.log(nome + ":Nome utente NO")
}
----- OUTPUT -----
marco_:Nome utente OK
Marco_:Nome utente NO
paolo_rossi!:Nome utente NO
paolo_rossi_01:Nome utente OK
pr:Nome utente NO
paolo_rossi_primo:Nome utente NO
paolorossiprimo:Nome utente OK
Esempio 4
Verificare se la partita iva aziendale è corretta
Soluzione Python:
# Formato partita iva
import re
piva="a1234567890"
formato="\d{11}"
if re.match(formato,piva)!=None:
print(piva+":Partita iva OK")
else:
print(piva+":Partita iva NO")
piva="12345678901"
if re.match(formato,piva)!=None:
print(piva+":Partita iva OK")
else:
print(piva+":Partita iva NO")
piva="1234567890a"
if re.match(formato,piva)!=None:
print(piva+":Partita iva OK")
else:
print(piva+":Partita iva NO")
----- OUTPUT -----
a1234567890:Partita iva NO
12345678901:Partita iva OK
1234567890a:Partita iva NO
Soluzione JavaScript:
piva = "a1234567890"
formato = /\d{11}/
if (piva.match(formato, piva)) {
console.log(piva + ":Partita iva OK")
} else {
console.log(piva + ":Partita iva NO")
}
piva = "12345678901"
if (piva.match(formato, piva)) {
console.log(piva + ":Partita iva OK")
} else {
console.log(piva + ":Partita iva NO")
}
piva = "1234567890a"
if (piva.match(formato, piva)) {
console.log(piva + ":Partita iva OK")
} else {
console.log(piva + ":Partita iva NO")
}
----- OUTPUT -----
a1234567890:Partita iva NO
12345678901:Partita iva OK
1234567890a:Partita iva NO
Esempio 5
Verificare se l'indirizzo e-mail è corretto
Soluzione Python:
# Formato e-mail
import re
email="gv@gmail.it"
formato="[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$"
if re.match(formato,email)!=None:
print(email+":Indirizzo e-mail OK")
else:
print(email+":Indirizzo e-mail NO")
email="@gmail.it"
if re.match(formato,email)!=None:
print(email+":Indirizzo e-mail OK")
else:
print(email+":Indirizzo e-mail NO")
email="gv.gmail.it"
if re.match(formato,email)!=None:
print(email+":Indirizzo e-mail OK")
else:
print(email+":Indirizzo e-mail NO")
email="gv@gmail.italia"
if re.match(formato,email)!=None:
print(email+":Indirizzo e-mail OK")
else:
print(email+":Indirizzo e-mail NO")
email="gv@gmail.com"
if re.match(formato,email)!=None:
print(email+":Indirizzo e-mail OK")
else:
print(email+":Indirizzo e-mail NO")
email="gv@gmailcom"
if re.match(formato,email)!=None:
print(email+":Indirizzo e-mail OK")
else:
print(email+":Indirizzo e-mail NO")
----- OUTPUT -----
gv@gmail.it:Indirizzo e-mail OK
@gmail.it:Indirizzo e-mail NO
gv.gmail.it:Indirizzo e-mail NO
gv@gmail.italia:Indirizzo e-mail NO
gv@gmail.com:Indirizzo e-mail OK
gv@gmailcom:Indirizzo e-mail NO
Soluzione JavaScript:
email = "gv@gmail.it"
formato = /[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/
if (email.match(formato, email)) {
console.log(email + ":Indirizzo e-mail OK")
} else {
console.log(email + ":Indirizzo e-mail NO")
}
email = "@gmail.it"
if (email.match(formato, email)) {
console.log(email + ":Indirizzo e-mail OK")
} else {
console.log(email + ":Indirizzo e-mail NO")
}
email = "gv.gmail.it"
if (email.match(formato, email)) {
console.log(email + ":Indirizzo e-mail OK")
} else {
console.log(email + ":Indirizzo e-mail NO")
}
email = "gv@gmail.italia"
if (email.match(formato, email)) {
console.log(email + ":Indirizzo e-mail OK")
} else {
console.log(email + ":Indirizzo e-mail NO")
}
email = "gv@gmail.com"
if (email.match(formato, email)) {
console.log(email + ":Indirizzo e-mail OK")
} else {
console.log(email + ":Indirizzo e-mail NO")
}
email = "gv@gmailcom"
if (email.match(formato, email)) {
console.log(email + ":Indirizzo e-mail OK")
} else {
console.log(email + ":Indirizzo e-mail NO")
}
----- OUTPUT -----
gv@gmail.it:Indirizzo e-mail OK
@gmail.it:Indirizzo e-mail NO
gv.gmail.it:Indirizzo e-mail NO
gv@gmail.italia:Indirizzo e-mail NO
gv@gmail.com:Indirizzo e-mail OK
gv@gmailcom:Indirizzo e-mail NO
Leggi anche le altre lezioni ...
COMPETENZE PER PROGRAMMARE:
1-I sistemi di numerazione
2-Mondo reale e Mondo Digitale
3-La reppresentazione digitale dei numeri interi e decimali
4-Le stringhe
6-Date, ore e fusi orari
Segui sul canale YouTube "Skill Factory Channel" la Playlist: COMPETENZE PER PROGRAMMARE
TUTORIALS
1-Laboratori di logica di programmazione in C
2-Impariamo a programmare con JavaScript
3-Ricominciamo dal linguaggio SQL
4-Introduzione alla logica degli oggetti
5-TypeScript
6-Impariamo a programmare in Python
7-Come sviluppare un sito in WordPress
PAR GOL (Garanzia di Occupabilità dei Lavoratori)
Se sei residente in Campania e cerchi lavoro, sai che puoi partecipare gratuitamente ad un corso di formazione professionale PAR GOL?
I corsi di formazione professionale PAR GOL sono finanziati dalla Regione Campania e ti permettono di acquisire una Qualifica Professionale Europea (EQF) e di partecipare ad un tirocinio formativo aziendale.
Invia il tuo CV o una manifestazione d'interesse a: recruiting@skillfactory.it
oppure
chiama ai seguenti numeri di telefono:
Tel.: 081/18181361
Cell.: 327 0870141
oppure
Contattaci attraverso il nostro sito: www.skillfactory.it
Per maggiori informazioni sul progetto PAR GOL, clicca qui.
Per maggiori informazioni sulle Qualifiche Professionali Europee (EQF), clicca qui.
Academy delle professioni digitali
Per consultare il catalogo dei corsi online della nostra Academy ...
... collegati al nostro sito: www.skillfactory.it