Quindicesima lezione

Confronto di stringhe

Cambiamo ora completamente argomento, e passiamo ad analizzare alcuni temi un poco più specialistici, che però ritornano spessissimo nella pratica della programmazione.

Per esempio, nell'uso che abbiamo fatto delle funzioni di trattamento di stringhe del C, è possibile che qualcuno abbia notato una certa maggiore complicazione, rispetto per esempio al Fortran (dove però sono completamente assenti i concetti di puntatori, di allocazione dinamica della memoria, e dunque di stringhe che cambiano dimensione en route).
Si può essere d'accordo con questa affermazione, ma non bisogna dimenticare che in compenso la libreria standard C permette di accedere ad alcune librerie di trattamento delle stringhe che affrontano il problema in modo decisamente più moderno.

Uno dei problemi che spesso si presentano nella scrittura dei programmi è quello del confronto di stringhe. Può essere ad esempio necessario controllare il contenuto degli argomenti ricevuti dall'utente, oppure letti da un file. E' buono stile di programmazione che questi controlli siano fatti nel modo più robusto (il programma non deve impazzire se riceve qualcosa di strano) e tollerante (il programma deve sapere accettare anche forme diverse, ma simili dello stesso argomento) possibile.
Elaborare stringhe in C con questi criteri può essere assai tedioso, oltre che incline ad errori. Esiste tuttavia un potente algoritmo simbolico, il cui uso sta diventando sempre più standard, che permette di rappresentare intere famiglie di stringhe, semplificando dunque il confronto. Si tratta delle cosiddette regular expressions, che passiamo ora a descrivere con la dovuta attenzione.

Regular expressions

Alcune considerazioni generali:

Regole fondamentali

Ecco un breve estratto della guida pratica di Perl, con indicate le parti che sono specifiche di Perl:

Quanto sono "standard" le R.E.?

La serie di caratteri descritte in questo documento si applica sostanzialmente a tutte le applicazioni di uso comune: egrep, perl, python, le librerie POSIX distribuite con i compilatori C/C++, vi (dopo aver dato il comando set extended), eccetera.
Per le funzioni più avanzate la realtà si presenta più complicata (questa figura, tratta da Jeffrey E.F. Friedl, Mastering Regular Expressions, O'Reilly serve solo da riferimento):

Uso delle R.E. in C

La libreria standard POSIX di R.E. è accessibile attraverso tre chiamate:

#include <regex.h>

Questo prova a convertire in un numero da 1 a 12 il nome di un mese, scritto in italiano, inglese, francese o tedesco.

Esercizio: Provare a scrivere un programma che interpreta una data completa utilizzando una R.E.