Curious TechieDev Toolbox
Tutte le Guide/Elaborazione Testo8 min read

Cos’è un’Espressione Regolare (Regex)?

Automi a stati finiti, classi di caratteri, quantificatori, asserzioni lookahead e difesa da ReDoS.

Punti Chiave
  • Le regex descrivono pattern di ricerca formali elaborati da automi finiti.
  • Si articolano tramite classi di caratteri, quantificatori e ancore di posizione.
  • Il Backtracking Catastrofico (ReDoS) genera complessità esponenziale su input errati.
  • Le asserzioni Lookaround testano contesti senza consumare caratteri nel flusso.

Le espressioni regolari (Regex) offrono una notazione algebrica compatta per cercare, convalidare ed estrarre pattern di testo complessi all’interno di stringhe, log e input utente.

1. Fondamenti della Grammatica Regex

I pattern valutano i caratteri in modo letterale (es. abc) o tramite metacaratteri che rappresentano classi di caratteri:

  • \d: Qualsiasi cifra numerica (0-9).
  • \w: Qualsiasi carattere alfanumerico compreso l’underscore.
  • \s: Qualsiasi spazio bianco (spazi, tabulazioni, a capo).
  • [a-z0-9]: Insiemi personalizzati di caratteri.

2. Quantificatori Greedy vs Lazy

Per impostazione predefinita, i quantificatori * e + sono greedy (ingordi) e catturano la porzione di testo più lunga possibile. Aggiungendo un punto interrogativo (*? o +?) diventano lazy (pigri), fermandosi alla prima corrispondenza utile.

3. Asserzioni Lookahead e Lookbehind

Le asserzioni a lunghezza zero convalidano condizioni di contesto senza consumare caratteri:

  • (?=...) Lookahead Positivo: Corrisponde se il pattern è seguito dall’espressione.
  • (?!...) Lookahead Negativo: Corrisponde se il pattern NON è seguito dall’espressione.
  • (?<=...) Lookbehind Positivo: Corrisponde se il pattern è preceduto dall’espressione.
  • (?<!...) Lookbehind Negativo: Corrisponde se il pattern NON è preceduto dall’espressione.

4. Prevenire il Backtracking Catastrofico (ReDoS)

Quando un motore con backtracking incontra quantificatori nidificati (come ([a-zA-Z]+)+$) valutati su testi non corrispondenti, il tempo di esecuzione scala in modo esponenziale (O(2^n)), bloccando il thread in un attacco ReDoS.