Tester di regex

Testa un’espressione regolare dal vivo: corrispondenze e gruppi di cattura, anteprima delle sostituzioni e divisione del testo — con la semantica di JavaScript.

Flag
Testo di prova
Risultati

Inserisci un pattern e un testo per vedere i risultati

Cosa fa questo strumento

Un’espressione regolare è un linguaggio compatto per descrivere schemi di testo, e l’unico modo affidabile di scriverne una è guardarla girare su testo reale. Questo tester fa esattamente questo, dal vivo, in tre modalità. Corrispondenza mostra ogni punto in cui il pattern corrisponde, evidenziato nel testo, con ogni gruppo di cattura elencato sotto. Sostituisci mostra in anteprima ciò che produrrebbe String.replace, compresi i riferimenti $1 e lt;name>. Dividi mostra come String.split taglierebbe il testo — comprese le parti che quasi nessuno prevede correttamente, come i delimitatori catturati che compaiono nel risultato.

Il pattern gira sul motore JavaScript del tuo stesso browser, non su un’imitazione. Ciò che corrisponde qui è esattamente ciò che corrisponderà nel tuo codice JavaScript, byte per byte, perché è lo stesso motore a fare il lavoro.

Leggere i risultati di corrispondenza

Ogni corrispondenza è evidenziata nel testo di prova ed elencata sotto con la sua posizione — gli offset di carattere in cui inizia e finisce. Se il pattern contiene gruppi di cattura, ogni gruppo compare sotto la propria corrispondenza con il valore catturato. I gruppi sono numerati in base alla parentesi di apertura, da sinistra a destra, esattamente come li numera il motore per $1, $2 e i riferimenti all’indietro; un gruppo con nome mostra il suo nome accanto al numero. Un gruppo che non ha preso parte alla corrispondenza — per esempio il lato perdente di un’alternanza — viene contrassegnato come tale invece di essere mostrato come stringa vuota, perché per il tuo codice sono cose diverse: undefined contro "".

Un pattern può legittimamente corrispondere a zero caratteri — ^, \b o un’alternativa vuota possono farlo. Quelle corrispondenze di lunghezza zero non evidenziano nulla, quindi lo strumento segna la posizione con una linea sottile invece di lasciarti a chiederti dove sia finita la corrispondenza.

I flag

I flag cambiano il comportamento dell’intero pattern, e due di essi causano gran parte della confusione sulle regex:

  • g (globale) — trova tutte le corrispondenze, non solo la prima. Senza, corrispondenza mostra un solo risultato e sostituisci cambia una sola occorrenza. È il flag che si dimentica più spesso.
  • i (ignora maiuscole/minuscole) — le lettere corrispondono a prescindere dalla loro forma.
  • m (multilinea) — ^ e $ corrispondono all’inizio e alla fine di ogni riga, non solo dell’intero testo.
  • s (dotAll) — il punto corrisponde anche agli a capo. Senza, . si ferma a ogni interruzione di riga.
  • u (Unicode) — il pattern lavora in punti di codice: emoji e altri caratteri fuori dall’intervallo di base si comportano correttamente, e gli escape di proprietà \p{…} diventano disponibili.
  • y (ancorato) — la corrispondenza deve iniziare esattamente dove è finita la precedente. Utile per i tokenizer; sorprendente ovunque altro.
  • d (indici) — il motore registra le posizioni esatte di ogni gruppo. Non cambia nulla di ciò che corrisponde.

I riferimenti di sostituzione

Il testo di sostituzione non è preso alla lettera — una manciata di sequenze con $ viene espansa per ogni corrispondenza. Da $1 a $9 inseriscono ciò che i gruppi numerati hanno catturato, lt;name> inserisce un gruppo con nome, amp; inserisce l’intera corrispondenza e $ produce un simbolo di dollaro letterale. Tutto il resto viene copiato così com’è.

"2026-07-20".replace(/(?<y>\d{4})-(\d{2})-(\d{2})/, "$3.$2.lt;y>")
// → "20.07.2026"

Un comportamento di JavaScript da interiorizzare: senza il flag g, replace cambia solo la prima occorrenza. Non è una stranezza di questo strumento — è ciò che farà il tuo codice. Lo strumento mostra un suggerimento quando g è disattivato, così la sostituzione singola non sembra un bug.

Come si comporta davvero split

String.split con una regex ha due comportamenti che sorprendono regolarmente anche gli sviluppatori esperti, e la modalità dividi esiste in gran parte per renderli visibili. Primo: se il pattern contiene gruppi di cattura, ciò che catturano viene intrecciato nell’array risultante tra i pezzi — dividere "a,b" con (,) produce tre parti: a, la virgola, b. Secondo: le corrispondenze proprio all’inizio o alla fine del testo, o due corrispondenze adiacenti, producono stringhe vuote nel risultato, che lo strumento mostra esplicitamente invece di nascondere.

"a,b".split(/(,)/)   // → ["a", ",", "b"]
",a,".split(/,/)     // → ["", "a", ""]

I pattern impazziti vengono fermati, non subiti

Alcuni pattern sono trappole. Un quantificatore annidato come (a+)+ provato contro una stringa lunga che quasi corrisponde costringe il motore a ritentare un numero esponenziale di combinazioni prima di arrendersi — si chiama backtracking catastrofico, e può congelare una scheda del browser per minuti. Questo strumento esegue il tuo pattern in un thread worker separato e lo ferma dopo due secondi: un pattern impazzito ti costa un messaggio invece di una pagina bloccata. Se vedi quel messaggio, cerca nel pattern quantificatori annidati o alternative sovrapposte; la soluzione di solito è far sì che la ripetizione interna e quella esterna non possano corrispondere allo stesso testo.

Come per ogni strumento di questo sito, il pattern e il testo non lasciano mai il tuo dispositivo — il worker fa parte della pagina, non di un server.

Domande frequenti

Quale variante di regex usa questo tester?
JavaScript (ECMAScript), perché il pattern gira sul motore del browser stesso. Gruppi con nome, lookbehind ed escape di proprietà Unicode \p{…} funzionano come nel JavaScript moderno. I pattern di PCRE o Python per lo più si trasferiscono bene, ma i costrutti che JavaScript non ha — quantificatori possessivi, gruppi atomici, \A e \z — verranno rifiutati o significheranno altro.
Perché il mio pattern trova una sola corrispondenza?
Quasi sempre: il flag g è disattivato. Senza, JavaScript si ferma alla prima corrispondenza, e replace cambia solo la prima occorrenza. Spunta la casella g per cercare in tutto il testo.
Cosa significa «non ha partecipato» per un gruppo?
Il gruppo esiste nel pattern ma non è stato usato in questa specifica corrispondenza — di solito perché si trova nel ramo perdente di un’alternanza, o sotto un quantificatore che ha corrisposto zero volte. Nel codice il suo valore è undefined, che è diverso dal catturare una stringa vuota, e lo strumento mantiene la distinzione.
Il mio pattern o il mio testo vengono inviati a un server?
No. La corrispondenza gira interamente nel tuo browser, in un thread worker della stessa pagina. Anche il limite di sicurezza di due secondi è applicato localmente — nulla di ciò che digiti lascia il tuo dispositivo.