Vai al contenuto

Linguaggi ed espressioni regolari

Da Wikiversità, l'apprendimento libero.
lezione
lezione
Linguaggi ed espressioni regolari
Tipo di risorsa Tipo: lezione
Materia di appartenenza Materia: Linguaggi formali e automi
Avanzamento Avanzamento: lezione completa al 100%

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.

Definizione

[modifica]

Formalmente definiamo espressione regolare una stringa r costruita su un alfabeto Σ={a1,a2,...,ak} 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:

  • r=
  • r=a, aΣ
  • r=(st) o r=(s|t)
  • r=(st) o r=(st) (notazione alternativa)
  • r=(s)

dove s e t 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:

  • ε=
  • r+=rr
  • rh=rr...rm (potenza)
  • [r]kn=rkrk+1...rn con nk (ripetizione)
  • [r]=εr
  • (0...9)=0123456789,(a...m)=abcdefghijklm (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 Lr è un linguaggio su un alfabeto Σ che ha una corrispondente RE in accordo con la seguente tabella:

Espressione Linguaggio
r=ε Lr={ε}
r=aΣ Lr={a}
r=st
r=s|t
Lr=LsLt
r=st
r=st
Lr=LsLt
r=s Lr=Ls

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:

r=(s(t(uz)+))

questa RE ha due SE: s e (t(uz)+), mentre t e (uz)+ NON sono SE di r, ma sono SE di (t(uz)+).

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:

(aa)(b((cc)+a))

la sua versione numerata è:

(a1a2)(b1((c1c2)+a3))

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:

  • ek, 1km è una scelta di (e1e2...ek)
  • em=e...em, m1 è una scelta di e+ e e
  • ε è una scelta di e

Diciamo che una SE e deriva da e (scritto come ee se:

  • e è una scelta di e;
  • oppure, e'i è una scelta di e'i per ogni 1im

La derivazione può avvenire più volte allo stesso modo. In questo caso scriviamo:

  • e0nen
    • se e0e1, e1e2, ..., en1en con n fisato
  • e0+en
    • se e0e1, e1e2, ..., en1en con n1
  • e0en
    • se e0e1, e1e2, ..., en1en con n0

Esempi

[modifica]
  • ab+a
  • ab+a+
  • ab+aε o equivalentemente ab+2ε o ancora ab++ε
  • ab+b+
  • ab+b+bbbb o equivalentemente ab+2bbbb o ancora ab++bbbb

Linguaggio definito da un RE

[modifica]

Il linguaggio definito da una espressione regolare r è:

Lr={xΣ|rx}

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:

a(ba)

Ambigua, due modi di derivazione di a:

  • a(ba)aa
  • a(ba)(ba)a

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:

a1(b1+a2)

Genera:

  1. ε
  2. a1
  3. a1a1
  4. a1a1a1
  5. b1
  6. b1b1
  7. a2
  8. ...

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).

[modifica]

Esempi pratici - https://www.evemilano.com/come-funzionano-le-espressioni-regolari-regex/

Altri progetti

[modifica]