In questa lezione analizzeremo la famiglia delle espressioni regolari (in inglese regular expression o, in forma abbreviata, regexp, regex o RE) di cui si invita a leggere come introduzione la relativa pagina di Wikipedia.
Formalmente definiamo espressione regolare una stringa
costruita su un alfabeto
e in unione ai seguenti metasimboli:
: insieme vuoto
: unione (notazione alternativa:
)
: concatenazione
: star
: parentesi
Una RE è detta ben formata se si presenta in una delle seguenti forme:


o 
o
(notazione alternativa)

dove
e
sono a loro volta espressioni regolari. Si noti che la precedenza degli operatori è:



Definiamo inoltre altri operatori non essenziali ma frequentemente usati, utilizzando solo le proprietà sopra descritte:


(potenza)
con
(ripetizione)
![[r]=\varepsilon \cup r](https://wikimedia.org/api/rest_v1/media/math/render/svg/ecd8501e52c789023cc7e5622df53765fb7d1956)
(intervalli ordinati)
Altri operatori possono essere quelli insiemistici teorici: intersezione, differenza e complemento. Una espressione regolare che contiene questi operatori è detta espressione regolare estesa. Nota: Il potere espressivo di una RE estesa non è maggiore di quello di una RE standard.
Definizione di linguaggio regolare[modifica]
Diciamo che un linguaggio è un linguaggio regolare se è denotato da una RE. Formalmente, un linguaggio regolare
è un linguaggio su un alfabeto
che ha una corrispondente RE in accordo con la seguente tabella:
Espressione
|
Linguaggio
|
|
|
|
|

|
|

|
|
|
|
Denotiamo con
la famiglia di tutti linguaggi regolari e con
la famiglia di tutti i linguaggi finiti (cioè con cardinalità finita).
Allora possiamo dire che:

(intuibile: un linguaggio finito può sempre essere visto come l'unione di un numero finito di stringhe, ognuna delle quali concatenazione di un numero finito di simboli dell'alfabeto)
Derivare il linguaggio dalla RE[modifica]
Per derivare il linguaggio dobbiamo definire alcuni concetti supplementari.
Sottoespressione[modifica]
Definiamo sottoespressione (in inglese subexpression o SE) una ben parentizzata sottostringa di una RE che si presenta nelle parentesi più esterne.
Chiariamo con un esempio. Sia data la RE:
questa RE ha due SE:
e
, mentre
e
NON sono SE di
, ma sono SE di
.
Versione numerata[modifica]
Definiamo 'versione numerata di una RE, la RE a cui vengono aggiunti i numeri alle lettere che compongono la RE, in modo da differenziale le lettere uguali. Anche qui chiariamo il concetto con un esempio:

la sua versione numerata è:

Questa notazione è importante per definire l'ambiguità di un linguaggio (introdotta nelle sezioni successive).
Scelta e derivazione[modifica]
Diciamo che una RE è una scelta (in inglese choice) di un'altra RE nei seguenti casi:
è una scelta di 
è una scelta di
e 
è una scelta di 
Diciamo che una SE
deriva da
(scritto come
se:
è una scelta di
;
- oppure,
è una scelta di
per ogni 
La derivazione può avvenire più volte allo stesso modo. In questo caso scriviamo:
- se
,
, ...,
con
fisato
- se
,
, ...,
con 
- se
,
, ...,
con 


o equivalentemente
o ancora 

o equivalentemente
o ancora 
Linguaggio definito da un RE[modifica]
Il linguaggio definito da una espressione regolare
è:

Diciamo che due RE sono equivalenti se definiscono lo stesso linguaggio.
Ambiguità delle RE[modifica]
Una stringa di un linguaggio regolare può essere derivato dalla RE in modi differenti, cioè attraverso distinte derivazioni. Diciamo che una RE è ambigua se esiste una stringa derivabile attraverso due distinte derivazioni che non differiscono solo dall'ordine di applicazione.
Esempio:

Ambigua, due modi di derivazione di
:


Condizione sufficiente affinché una RE sia ambigua, se il linguaggio generato dalla RE in versione numerata include due stringhe che coincidono a meno dei numeri.
Esempio:

Genera:







- ...
Come si vede eliminando i numeri, la stringa 2 coincide con la stringa 7, perciò la RE è ambigua.
Proprietà di chiusura[modifica]
«Un insieme è chiuso rispetto a un'operazione se e solo se ogni insieme ottenuto applicando l'operazione ai membri dell'insieme originale, l'insieme ottenuto è contenuto nell'insieme originario»
|
è chiuso rispetto alla concatenazione, unione e star (quindi anche per gli altri operatori sopra descritti).
Link e riferimenti[modifica]
Esempi pratici - https://www.evemilano.com/come-funzionano-le-espressioni-regolari-regex/