Un’introduzione alle espressioni regolari

Introduzione

Come amministratori di sistema, sviluppatori, ingegneri QA, ingegneri di supporto, ecc. è necessario trovare un particolare modello, come un insieme di indirizzi IP appartenenti a determinati intervalli o un intervallo di timestamp o gruppi di nomi di dominio o sottodomini, dai file. Potrebbe anche essere necessario trovare una parola scritta in un modo particolare o trovare possibili errori di battitura in un file. Ecco dove entrano in gioco le espressioni regolari.

Le espressioni regolari sono modelli per corrispondere a pattern (o talvolta per non corrispondere a pattern). Forniscono un modo per descrivere e analizzare il testo. Questo tutorial fornirà una panoramica delle espressioni regolari senza entrare nelle particolarità di un linguaggio specifico. Useremo semplicemente egrep per spiegare i concetti.

Espressioni Regolari

Le espressioni regolari consistono in due tipi di caratteri:

  • i caratteri regolari letterali e

  • i metacaratteri

Questi metacaratteri sono quelli che danno potere alle espressioni regolari.

Considera il seguente file country.txt dove la prima colonna è il nome del paese, la seconda colonna è la popolazione del paese e la terza colonna è il continente.

$ cat country.txt
India,1014003817,Asia
Italy,57634327,Europe
Yemen,1184300,Asia
Argentina,36955182,Latin America
Brazil,172860370,Latin America
Cameroon,15421937,Africa
Japan,126549976,Asia

Metacaratteri di ancoraggio

Il primo gruppo di “metacaratteri” di cui parleremo sono ^ e $. ^ e $ corrispondono rispettivamente all’inizio e alla fine di un modello e sono chiamati metacaratteri di ancoraggio.

Per trovare il nome di tutti i paesi il cui nome inizia per I, usiamo l’espressione:

$ egrep '^I' country.txt
India,1014003817,Asia
Italy,57634327,Europe

o per trovare tutti i paesi che hanno nomi di continenti che terminano per e, facciamo:

$ egrep 'e$' country.txt
Italy,57634327,Europe

Il prossimo metacarattere è il punto (.), che corrisponde a un solo carattere. Per trovare tutte le righe in cui il nome del paese è esattamente lungo 5 caratteri:

$ egrep '^.....,' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Yemen,1184300,Asia
Japan,126549976,Asia

Come fare a trovare tutte le righe in cui il nome del paese inizia con I o J e il nome del paese è lungo 5 caratteri?

$ egrep '^[IJ]....,' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Japan,126549976,Asia

[…] è chiamato un set di caratteri o una classe di caratteri. All’interno di un set di caratteri viene corrisposto solo uno dei caratteri dati.

Un ^ all’interno del set di caratteri nega il set di caratteri. L’esempio seguente corrisponderà ai nomi dei paesi lunghi cinque caratteri ma che non iniziano né per I né per J.

$ egrep '^[^IJ]....,' country.txt
Yemen,1184300,Asia

Il metacarattere di raggruppamento e l’alternanza

Per trovare tutte le righe contenenti Asia o Africa:

$ egrep 'Asia|Africa' country.txt
India,1014003817,Asia
Yemen,1184300,Asia
Cameroon,15421937,Africa
Japan,126549976,Asia

Questo può essere fatto anche prendendo A e a come comuni.

$ egrep 'A(si|fric)a' country.txt
India,1014003817,Asia
Yemen,1184300,Asia
Cameroon,15421937,Africa
Japan,126549976,Asia

Quantificatori

Invece di scrivere

$ egrep '^[IJ]....,' country.txt

possiamo scrivere

$ egrep '^[IJ].{4},' country.txt

dove {} sono chiamati quantificatori. Determinano quante volte il carattere prima di loro dovrebbe comparire.

Possiamo anche dare un intervallo:

$ egrep '^[IJ].{4,6},' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Japan,126549976,Asia

Questo corrisponderà ai nomi dei paesi che iniziano con I o J e hanno da 4 a 6 caratteri dopo di esso.

Ci sono alcune scorciatoie disponibili per i quantificatori. Ad esempio,

{0,1} è equivalente a ?

$ egrep '^ab{0,1}c$' filename

è lo stesso di

$ egrep '^ab?c' filename

{0,} è equivalente a *

$ egrep '^ab{0,}c$' filename

è lo stesso di

$ egrep '^ab*c' filename

{1,} è equivalente a +

$ egrep '^ab{1,}c$' filename

è lo stesso di

$ egrep '^ab+c' filename

Vediamo alcuni esempi che coinvolgono le espressioni che abbiamo visto finora. Qui invece di cercare da un file, cerchiamo dall’input standard. Il trucco che usiamo è che sappiamo che grep (o egrep) cerca un modello, e se viene trovato un modello, viene mostrata l’intera riga contenente il modello.

Vorremmo scoprire tutti i modi possibili per scrivere la frase il completo grigio era il suo preferito.

L’espressione sarebbe:

$ egrep 'the gr[ea]y colou?r suit was his favou?rite'
the grey color suit was his favourite
the grey color suit was his favourite

the gray colour suit was his favorite
the gray colour suit was his favorite

Osservando l’espressione sopra, possiamo vedere che:

  • grigio può essere scritto come grigio o gray

  • colore può essere scritto come colore o color, il che significa che la u è opzionale quindi usiamo u?

  • similmente preferito o preferito può essere scritto favou?rite

Come si fa a trovare un codice postale USA?

$ egrep '^[0-9]{5}(-[0-9]{4})?$'
83456
83456

83456-

834562

92456-1234
92456-1234

10344-2342-345

Un altro esempio di corrispondenza di tutti gli orari validi in un orologio a 24 ore.

$ egrep '^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]'
23:44:02
23:44:02

33:45:11

15:45:33
15:45:33

Nell’esempio sopra abbiamo detto che, se la prima cifra dell’ora è 0 o 1, allora la seconda sarà
qualsiasi da 0 a 9. Ma se la prima cifra è 2, allora i valori consentiti per la seconda cifra sono 0, 1, 2 o 3.

Bordo della parola

Per scrivere un modello per corrispondere alle parole che finiscono con color in modo che unicolor, acquerello, multicolor ecc.
siano corrisposti ma non colorless o colorful. Prova questi esempi da solo, per familiarizzare con essi:

$ egrep 'color\>'

Successivamente, per corrispondere a colorless e colorful, ma non unicolor, acquerello, multicolor, ecc.

$ egrep '\<color'

In questo modo per corrispondere esattamente alla parola color, facciamo:

$ egrep '\<color\>'

Riferimenti indietro

Supponiamo di voler abbinare tutte le parole che sono state digitate due volte, come il il o prima prima, dobbiamo usare i riferimenti indietro. I riferimenti indietro vengono utilizzati per ricordare i modelli.

Ecco un esempio:

$ egrep "\<the\> \1"

O il modo generico:

$ egrep "\<(.*)\> \1"

L’esempio sopra può essere utilizzato per trovare tutti i nomi in cui i nomi e cognomi sono gli stessi. Nel caso ci siano più di una serie di parentesi, allora il secondo, terzo, quarto, ecc. possono essere referenziati con \2, \3, \4, ecc.

Questo è solo un’introduzione alla potenza delle espressioni regolari.

Source:
https://www.digitalocean.com/community/tutorials/an-introduction-to-regular-expressions