Espressioni regolari in C++11, introduzione

18 settembre 2012

C++11 è lo standard per il linguaggio C++ approvato dopo un lungo percorso il 12 Agosto 2012. Tra le numerose funzionalità introdotte c’è il supporto nativo alle espressioni regolari.

Perché l’introduzione delle Espressioni Regolari (chiamate per brevità regex) è una novità così importante? Tra gli impieghi più frequenti delle regex in programmazione c’è la validazione dell’input, ovvero quel controllo che verifica, ad esempio, se ciò che l’utente ha inserito in un campo numerico sia un numero valido oppure no.

Prima del rilascio del nuovo standard, validare l’input significava scrivere le proprie funzioni per la verifica dei dati inseriti e per la gestione di eventuali eccezioni, oppure utilizzare librerie specializzate (come boost).

In questo articolo vedremo allora come utilizzare l’implementazione delle regex all’interno di C++11.

Compatibilità dei compilatori

L’elaborazione delle espressioni regolari è già supportata da alcuni dei maggiori compilatori (fra i quali Clang++ e Visual C++ 2010 e seguenti) tuttavia, nel momento in cui scrivo, G++ 4.6 ha ancora un supporto parziale alle espressioni regolari: i sorgenti vengono compilati ma non eseguiti. Quindi per eseguire il codice di esempio di questo tutorial è bene che vi muniate di alternative valide.

La sintassi delle regex in C++11

Con le espressioni regolari è possibile validare un input (e molto altro) in modo semplice a patto di imparare la loro sintassi. Le regex sono infatti un modo di descrivere la struttura di una stringa (un pattern), permettendo così al computer di identificarla all’interno di un testo (matching) oppure dire se una stringa in ingresso sia dotata o no della stessa struttura.

Ad esempio ogni numero intero può cominciare opzionalmente con il simbolo “meno” (-) e segue con una serie di cifre. Con una espressione regolare è possibile descrivere questa struttura e riconoscere immediatamente la stringa "-304" come valida e scartare, ad esempio, la stringa "35op90".

Nelle espressioni regolari in C++ è possibile utilizzare diversi tipi di sintassi semplicemente passando un opzione come parametro delle funzioni. L’implementazione di default prevede però la sintassi ECMAScript ed è proprio di questa che elenchiamo gli elementi fondamentali in una piccola tabella:

SimboloSignificato
. (punto)Qualunque carattere ad esclusione dei terminatori di riga
[:alpha:]Qualunque carattere alfabetico
[:alnum:]Qualunque carattere alfanumerico
[:digit:]Qualunque cifra compresa fra 0 e 9
\sSpazio
[^:class:]Nega la classe. Ad esempio [^:digit:] significa: qualsiasi carattere che non sia una cifra
* (asterisco)Zero o più ripetizioni della struttura precedente
+ (più)Una o più ripetizioni della struttura precedente
? (interrogativo)La struttura precedente è opzionale
{int}La struttura precedente viene ripetuta esattamente int volte
$La struttura è collocata alla fine della frase
^La struttura è collocata all’inizio della frase
| (pipe)Separa una serie di possibilità. Ad esempio a | b significa che può comparire il carattere a oppure il carattere b

La struttura di <regex>

L’implementazione delle espressioni regolari in C++ è costituita principalmente da:

  • 3 funzioni (in particolare sono template di funzioni) per l’esecuzione delle tre più comuni operazioni con le espressioni regolari:
    • matching (regex_match)
    • ricerca (regex_search)
    • sostituzione (regex_replace)
    Parleremo con sufficiente dettaglio di queste funzioni negli esempi successivi.
  • basic_regex, una classe per memorizzare e definire un’espressione regolare. Questa classe può a sua volta essere istanziata come regex (espressioni regolari su stringhe) oppure come wregex (espressioni regolari per stringhe wide).
  • match_result, una classe per memorizzare i risultati di una ricerca o di un matching. .
  • regex_error, classe per la gestione delle eccezioni.
  • regex_iterator, classe per gestire l’iterazione fra le diverse strutture identificate in una stringa.
  • Infine il namespace regex_constants che contiene tutta una serie di costanti e bitmask per passare parametri alle funzioni del modulo regex.
Se vuoi aggiornamenti su Espressioni regolari in C++11, introduzione inserisci la tua e-mail nel box qui sotto:
 
X
Se vuoi aggiornamenti su Espressioni regolari in C++11, introduzione

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento di cui al punto 3 dell'informativa sulla privacy