Informatica di base

Entità e comandi meno noti nelle regex

Autore

Manuel Ricci

Nelle lezioni precedenti abbiamo visto le entità e i comandi più usati delle regular expression. In questa lezione vediamo invece gli esclusi, quelli che non ho trattato perché usati di meno o in quasi totale disuso. Alcuni di questi ovviamente possono essere ancora molto utili (come ad esempio quando in testo si va a capo), ma altri invece appartengono al passato e per completezza è giusto citarli.

Il carattere BELL

BELL è un carattere di controllo che in passato veniva utilizzato per far emettere un suono ai videoterminali.

Con le espressioni regolari si può cercare questo carattere con \a.

Volendo si può anche provare a riprodurre il suono da terminale. Sui sistemi Unix basterà eseguire questo comando:

1$ echo $’\a’

Mentre da Windows:

1$ echo ^G

Dove ^G lo potete ottenere digitando CTRL + G.

Gli NPC

NPC in questo caso non sta per personaggio non giocante, ma per carattere non stampabile (Non-Printable Characters). Sono tutti caratteri di controllo simili a BELL. I più comuni:

  • null
  • bell
  • backspace
  • horizontal tab
  • line feed
  • vertical tab
  • form feed
  • carriage return
  • Control-Z
  • escape

In questa tabella possiamo “vedere” che i primi caratteri non sono visibili con a fianco scritto <control>, questi sono tutti caratteri di controllo che non hanno rappresentazione. Potreste trovare dei simboli che li rappresentano, ma come sempre dipende dalla codifica. Nelle regex possiamo individuali con \cX dove X è il carattere usato per riconoscerlo.

Escape

Il carattere ESCAPE usato in passato per interrompere il processo di stampa può essere individuato con \e o \x1B o \c[.

Nuovo inizio

Questo è il mio preferito tra questi caratteri “esotici”. In pratica \K imposta la nuova posizione della regex ignorando tutto ciò che viene prima.

Questa regex [\d]+\K[\d,]+ applicata a questo testo 123,456,789 individua tutto ciò che viene dopo la prima virgola, ma non 123.

Caratteri ottali

Sempre per individuare carattere attraverso la loro codifica possiamo usare \ddd dove ddd è il numero ottale del carattere codificato in UTF-8. Sempre nella tabella di prima possiamo vedere la colonna UTF-8 (oct.) il numero riportato in quella colonna corrisponde al carattere nella colonna precedente.

\041 corrisponde a !.

Form feed

Altra entità che serve ad individuare un carattere di controllo è \f che individua il carattere di controllo form feed. Questo carattere veniva usato per comunicare alla stampante di saltare alla pagina successive.

Lo stesso carattere può essere trovato con \cL o \x0C

A capo

Qui c’è un po’ di casino per colpa di Microsoft. \n è il carattere di fine riga (line feed), ma su Windows per qualche strana ragione è \n insieme a \r.

Questo ha causato un po’ di problemi in passato, anche i software moderni che trattano file hanno sistemi di conversione automatica. Git ad esempio, durante la fase di installazione su Windows ci chiede come vogliamo trattare questa situazione.

\n equivale a \xA e \cJ, mentre \r equivale a \x0D.

Tab verticali e orizzontali

\v oggi è un po’ meno noto di suo fratello \t. Il primo infatti veniva usato in passato per comandare la stampante di avanzare con la carta. \t è ancora in uso oggi dato che è quel carattere che otteniamo prendendo il pulsante TAB della nostra tastiera. Quello che usiamo per indentare il codice, tanto per intenderci.

I commenti

Potevano mancare i commenti anche nelle regex? Siamo chiaro, difficilmente abbiamo a che fare con Regex tanto lunghe da dover avere bisogno di commenti al loro interno. Ma in fondo non è questo il senso dei commenti? Supporre sempre che non servano.

Comunque, il commento può essere fatto con questo comando (?#...) dove ... è il commento.

Prendiamo in esame la regex che abbiamo scritto quando abbiamo visto i quantificatori nelle regular expression relativa al codice fiscale.

1^[A-Z]{6}\d{2}[A-Z]\d{2}[A-Z]\d{3}[A-Z]$

Con i commenti sarebbe così:

1^(?#nome)[A-Z]{6}(?#anno)\d{2}(?#mese)[A-Z](?#giorno)\d{2}(?#comune)[A-Z]\d{3}(?#checksum)[A-Z]$

Personalmente reputo che il commento aggiunga ulteriore difficoltà nel leggere la regex ed è estremamente più probabile che commenti con i commenti offerti dal linguaggio in uso per far capire cosa fa esattamente l’espressione regolare.

Conclusioni

Queste sono le entità e i comandi che reputo necessitino una menzione, sia per valenza storico che in generale eventuale utilità. Non sono ancora tutti però, ce ne sono tanti altri che possono essere scoperti anche nella quick reference di regex101.com. Molte di queste sono semplici scorciatoie o alias di altri comandi quindi inutili da menzionare, ma buttateci comunque un occhio.

Ci siamo quasi, siamo veramente agli sgoccioli. La prossima sarà l’ultima lezione di questo corso sulle regular expression. Arrivati a questo punto dovrebbe essere passata un po’ la paura delle regex e spero che siate riusciti a comprenderle meglio.

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.