La backreference nelle espressioni regolari

L'uso dei gruppi mi consente di parametrizzare la regex tramite le backreference.

Cos'è la backreference? Si intende il riferimento (reference) a un gruppo già indicato precedentemente (back) nell'espressione regolare.

I rifimenti ai gruppi sono composti dallo slash seguito da un numero, che indica l'ordine del gruppo da sinistra verso destra.

\1
\2
\3

Un esempio pratico

Voglio trovare le parole palindrome di quattro lettere in un testo.

Nota. I palindromi sono i termini che si possono leggere anche al contrario. Ad esempio "alla", "otto", ecc.

In questo testo ci sono due parole di quattro lettere ("come" e "alla").

un esempio pratico di backreference in Regex

L'espressione regolare mi seleziona soltanto "alla" perché è un palindromo, non seleziona "come" perché non lo è.

La spiegazione

L'espressione seleziona una parola, da un bordo all'altro (\b \b).

Ho trasformato il primo carattere in un gruppo (\w). Poi ho fatto lo stesso per il secondo carattere (\w).

A questo punto ho usato la backreference indicando prima il riferimento \2 al secondo gruppo e poi il riferimento \1 al primo gruppo.

Per questa ragione soltanto il termine "alla" viene selezionato nel matching.

\w =a ( primo gruppo = \1 )
\w =l ( secondo gruppo = \2 )
\2 =l
\1 =a

E così via.

Come assegnare un nome ai backreference

Nel corso del tempo i linguaggi di programmazione hanno aggiunto la possibilità di associare delle etichette mnemoniche ai gruppi delle backreference.

Per farlo basta aggiungere ?P<nome> dentro le parentesi tonde del gruppo.

(?P<nome>)

A cosa servono le etichette?

Invece di richiamare la backreference con l'ordine \1 , \2 , si richiamano con l'etichetta assegnata. In questo modo l'espressione regolare è più facile da leggere.

Per richiamare la bachreference, invece di \1 o \2 digito

(?P=nome)

oppure

\g<nome>

Un esempio pratico

Riscrivo la precedente regex usando delle etichette.

Il risultato è sempre lo stesso.

un esempio di espressioni regolari con le etichette

Pro e contro delle etichette

Le etichette rendono le backreference più leggibili.

Tuttavia, la sintassi di assegnazione delle etichette non è sempre la stessa in tutti i linguaggi di programmazione ( python, java, Visual Basic, php, Ruby, Perl, javascript ).

Secondo me, è quindi preferibile usare i parametri numerici ( \1,\2, ecc. ) perché funzionano su tutti i linguaggi anche se sono più difficili.

 


 

Segnalami un errore, un refuso o un suggerimento per migliorare gli appunti

FacebookTwitterLinkedinLinkedin
knowledge base
  1. I quantificatori
  2. La ricerca greedy o lazy
  3. I gruppi
  4. I gruppi passivi
  5. La backreference
  6. La selezione alternativa