Skillbook Logo
foto profilo

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.

La stringa REGEXP seguente:

^[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.

 

Classi
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]+$

verifica se la stringa non contiene numeri ed è composta almeno da un carattere.

La stringa REGEXP seguente:

^[^0-9]*$

verifica se la stringa non contiene numeri, in questo caso può anche essere vuota.
 
La stringa REGEXP seguente:
 
((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{8,20})
 
Verifica che la password deve contenere un numero, un carattere minuscolo, uno maiuscolo e un carattere speciale tra @#$% e deve avere lunghezza min 8 e max 20
 

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:

[s|S]kill [f|Factory]
 
La stringa skill factory è valida anche se inizia con le lettere maiuscole.

La stringa REGEXP seguente:

[^0-9]*\n
 
verifica se la nella stringa che non contiene numeri, esiste il codice di fine riga (a capo = \n).
 
La stringa REGEXP seguente:
 
\w*\s
 

verifica se la stringa alfanumerica contiene uno spazio.

La stringa REGEXP seguente:
 
\w*\S
 

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:

// Formato EURO
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:

// Formato DATA gg/mm/aaaa
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 utente è formato da soli caratteri alfanumerici minuscoli, più  _ e – di lungezza min 3 e max 15
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:

// Formato partita iva
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:

// Formato e-mail
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 GOLclicca 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

regexp espressioni regolari regular expression python javascript validazione ancore qualificatori classi modificatori pattern formati di validazione

Share Button
TOP