Informatica di base

Caratteri speciali nelle regular expression

Autore

Manuel Ricci

Nella lezione precedente di introduzione alle espressioni regolari ci siamo lasciati con la regex \bnero\b. Ripartiamo proprio da qui per poter approfondire ulteriormente i caratteri speciali che abbiamo a disposizione nelle regular expression, perché ce ne sono un bel po’, 32 per la precisione.

Ma come capiamo quando un carattere è speciale?

Osserviamo ancora una volta la regexp della lezione scorsa

1\bnero\b

nero sappiamo essere la parola che stiamo cercando, ma le altre due lettere b, che cosa le accomuna? Ci siete arrivati? È il \ (backslash).

Caratteri speciali con backslash

Ci sono 20 caratteri speciali dove il backlash precede una lettera e sono:

  • \A = inizio del testo
  • \a = bell
  • \b = bordo di una parola
  • \B = tutto tranne \b
  • \c = controllo
  • \d = cifra
  • \D = tutto tranne \d
  • \e = escape
  • \f = fine pagina
  • \n = fine riga
  • \r = carret return
  • \s = spazio
  • \S = tutto tranne \s
  • \t = tabulazione
  • \uHHHH = carattere unicode
  • \v = tabulazione verticale
  • \w = parola
  • \W = tutto tranne \w
  • \xHH = carattere ASCII
  • \Z = fine testo

Non vi preoccupate, andremo nel dettaglio per la maggior parte di quelle presenti nella lista nelle prossime lezioni, per ora sappiate che questi sono i caratteri preceduti da \ che nelle espressioni regolari significano qualcosa di specifico.

Cosa sarebbe successo se avessimo omesso \b?

Nelle considerazione fatte nelle lezione precedente prima di fare l’esercizio pratico avevo detto che bisognava fare attenzione al fatto che la parola fosse nero, non abanero o nerone, ma nero.

Prendendo in considerazione le seguenti frasi:

  • nerone incendiò Roma
  • il peperoncino habanero è molto piccante
  • il gatto nero è bellissimo

E se rimuovessimo \b dalla regular expression avremmo una corrispondenza in tutte e tre le frasi, ma con l’ausilio di \b solo la terza frase avrà una corrispondenza.

Tornando al backslash

Come avrete già intuito il \ è un carattere molto utile nelle espressioni regolari, tanto utile che ha due funzioni contrapposte:

  1. Rende speciali i caratteri normali
  2. Rende normali i caratteri speciali

Questo perché oltre ai caratteri speciali visti prima ce ne sono degli altri a cui non serve backslash, ma hanno un significato specifico.

Caratteri speciali senza backslash

  • ^ = inizio riga
  • $ = fine riga
  • * = zero o più
  • + = uno o più
  • ? = zero o uno
  • . = qualsiasi carattere tranne \n
  • ( ) = gruppo
  • { } = numero di ripetizioni
  • [ ] = insieme di caratteri
  • | = stringhe alternative
  • / = anteposto ai modificatori
  • \ = lo conosciamo già bene

Questi altri caratteri sono quelli con la quale si tende maggiormente a litigare quando si creano le espressioni regolari, ma niente panico, piano piano li vedremo tutti all’opera. Alcuni già in questa lezione.

Mettiamo in pratica

Supponiamo di avere questo testo:

Costa 100$ tasse escluse

  1. Partiamo semplici: stiamo cercando 100$. Cosa scriviamo?
  2. Aumentiamo un pochino la difficoltà: stiamo cercando una qualsiasi cifra seguita dal simbolo del dollaro o dell’euro

Provate e poi continuate a leggere.

Fatto?

Partiamo dal primo esercizio, il quale è abbastanza semplice, se lo compariamo al secondo. Partiamo subito con rispondere alla domanda, ci serve \b, no. Possiamo scrivere anche solo 100$, ma attenzione perché il simbolo del dollaro $ è un carattere speciale e quindi va fatto l’escape (da speciale a normale) con l’aiuto del backslash, in questo modo 100\$.

Questo permetterà di soddisfare la richiesta del primo esercizio.

Il secondo è un po’ più particolare, scomponiamo la richiesta:

  • una qualsiasi cifra
  • seguita dal simbolo del dollaro o dell’euro

Negli elenchi che ho riportato nei paragrafi precedenti abbiamo tutto il necessario.

La cifra viene indicata con il carattere speciale \d, ma questo prenderebbe solo in considerazione la singola cifra, abbiamo bisogno di un quantificatore che dica uno o più cifre e quello può farlo il + (uno o più).

Quindi fin qui la nostra regexp sarà questa

1\d+

Tutte le cifre sarebbero trovate, ma manca l’ultima parte. Questa cifra di uno o più cifre deve essere seguita dal simbolo del dollaro o dell’euro. Per definire un insieme di caratteri possiamo usare le parentesi quadre [ ] (insieme di caratteri) e possiamo separare le alternative con la pipe |.

Quindi la nostra espressione regolare sarà questa:

1\d+[$|€]

Perché non serve il backslash davanti al simbolo del dollaro, perché ciò che c’è tra le parentesi quadre, al di là di qualche eccezione (vedi la pipe) è già considerato carattere normale.

Volendo essere ancora più pignoli, chi scrive i prezzi potrebbe aggiungere accidentalmente uno spazio tra la cifra e il simbolo della valuta. In quel caso possiamo avvalerci di \s (spazio) e del quantificatore ? (zero o uno). Il risultato sarà questo:

1\d+\s?[$|€]

Conclusioni

Con questa lezione non solo abbiamo scoperto i caratteri speciali e l’importanza del backslash nelle regular expression, ma abbiamo anche scritto la nostra prima regexp un pochino più complessa.

Caricamento...

Diventiamo amici di penna? ✒️

Iscriviti alla newsletter per ricevere una mail ogni paio di settimane con le ultime novità, gli ultimi approfondimenti e gli ultimi corsi gratuiti puubblicati. Ogni tanto potrei scrivere qualcosa di commerciale, ma solo se mi autorizzi, altrimenti non ti disturberò oltre.

Se non ti piace la newsletter ti ricordo la community su Discord, dove puoi chiedere aiuto, fare domande e condividere le tue esperienze (ma soprattutto scambiare due meme con me). Ti aspetto!

Ho in previsione di mandarti una newsletter ogni due settimane e una commerciale quando capita.