Che cosa significa « testare un'espressione regolare »?
Testare un'espressione regolare (« regex test online », « tester regex javascript ») consiste nell'eseguire un pattern su un testo reale e nell'osservare esattamente ciò che il motore restituisce: le stringhe corrispondenti, la loro posizione e il valore dei gruppi di cattura. Un pattern che « sembra giusto » non dice nulla finché non è girato sui tuoi dati — è l'unica differenza che conta tra la regex del tutorial e la regex di produzione.
Il test risponde a tre domande distinte. Se corrisponde : la tabella delle corrispondenze lo dice subito. Dove e quanti : l'indice e la lunghezza mostrano se l'ancora era nel posto giusto. Cosa cattura : i gruppi numerati o con nome rivelano se la parte che volevi estrarre è davvero quella giusta.
I metacaratteri che fanno la differenza
Il punto . sostituisce qualsiasi carattere tranne il carattere di nuova riga — da qui il flag s quando il tuo testo è multilinea. I quantificatori *, + e ? sono greedy : si fermano al primo numero di ripetizioni sufficiente. Il suffisso ? (*?, +?, {2,5}?) inverte questo comportamento e dà la versione lazy, quella che quasi sempre conviene preferire quando un .* divora la fine della riga.
Le parentesi quadre definiscono una classe: [abc] accetta un carattere tra quelli elencati, [^abc] tutto tranne essi, [a-z0-9] un intervallo. Attenzione alla negazione all'inizio della classe — [^...] solo per la prima posizione, altrimenti ^ torna letterale. La barra verticale | separa le alternative e si comporta come una priorità bassa: ^cat|dog$ significa « tutto il testo vale cat » o « tutto il testo vale dog », non « cat o dog all'inizio o alla fine » — allora bisogna raggruppare: ^(?:cat|dog)$.
Gruppi, lookahead e lookbehind
Le parentesi catturano. Il gruppo 1 è accessibile con $1 nel lato sostituzione e \1 nel lato pattern, i gruppi con nome con $<nom> e \k<nom> — molto più leggibile già da tre gruppi. (?:...) raggruppa senza creare un numero, e conviene preferirlo quando si cattura solo per la struttura.
Le previsioni (lookaround) verificano senza consumare: (?=...) esige che ciò che segue corrisponda, (?!...) lo vieta, (?<=...) e (?<!...) fanno altrettanto per ciò che precede. È così che si impone un carattere speciale in una password senza includerlo nella cattura: ^(?=.*\d)(?=.*[A-Z]).{12,}$.
ReDoS: quando la regex diventa una bomba a orologeria
Il ReDoS (Regular Expression Denial of Service) deriva dal backtracking : di fronte a un input quasi conforme, un pattern come (a+)+$ esplora tutti i modi di tagliare gli « a » prima di fallire, e il numero di esplosioni cresce in modo esponenziale. Due riflessi: testa il pattern su un volume realistico — la scheda Prestazioni lo fa per te — e non far mai girare una regex non auditabile su un input esterno senza limite di dimensione. Su un server, una regex bloccata congela un worker intero fino alla scadenza del timeout.
JavaScript, PCRE, Python: le stesse basi, qualche differenza
Il tester usa il motore nativo del browser, cioè ECMAScript. Le sintassi di base — classi, quantificatori, gruppi, lookahead, flag g i m s u y — sono comuni a PCRE (PHP, Perl), a Python con re, a Java e a Go. Le differenze riguardano soprattutto il lookbehind (a lungo assente da JavaScript, oggi supportato), le proprietà Unicode e i flag in linea come (?i), propri di PCRE. Tradurre un pattern da un linguaggio all'altro resta quindi un esercizio di precisione — non di invenzione.
Consigliato per
Sviluppatori front-end e back-end (validazione di form, parsing dei log, migrazione dati), ops e DevOps (filtri di configurazione, regole WAF), tester e analisti (estrazione di colonne, controllo di formato), redattori e data analyst (pulizia di file), studenti (capire i metacaratteri), e chiunque abbia bisogno di un tester di espressioni regolari veloce, completo e riservato — con in complemento il formattatore JSON, l'codificatore/decodificatore URL, l'codificatore/decodificatore Base64 e il codificatore/decodificatore JWT.