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.