Tester regex
Basta digitare un pattern, selezionare i flag necessari e incollare del testo: ogni corrispondenza viene evidenziata mentre si scrive ed elencata con la sua posizione e i gruppi di cattura. Il pattern viene eseguito dal motore regex JavaScript del browser stesso, quindi i risultati coincidono con quelli del proprio codice e il testo resta sul dispositivo.
0 caratteri · 0 parole · 0 righe
Le corrispondenze vengono evidenziate qui.0 caratteri · 0 parole · 0 righe
Funziona interamente in questa scheda del browser. Il testo non viene mai caricato né salvato.
Token delle regex JavaScript
La colonna della prima corrispondenza è stata prodotta eseguendo ogni pattern sul relativo testo con il motore JavaScript che ha generato questa pagina.
| Token | Significato | Pattern | Testo | Prima corrispondenza |
|---|---|---|---|---|
\d | Cifra 0–9 | /\d+/ | Order 66 shipped | 66 |
\w | Lettera, cifra o trattino basso (ASCII) | /\w+/ | snake_case-id | snake_case |
\s | Spazio bianco, comprese tabulazioni e a capo | /\s+/ | two spaces | |
. | Qualsiasi carattere tranne l'a capo (salvo s) | /a.c/ | abc a-c | abc |
^ $ | Inizio e fine dell'input (o della riga, con m) | /^\w+$/ | single | single |
[abc] | Uno dei caratteri elencati | /[aeiou]/ | rhythm and blues | a |
[^abc] | Qualsiasi carattere non elencato | /[^0-9]+/ | 2026-10-18 | - |
* + ? | 0 o più, 1 o più, 0 o 1 | /colou?r/ | color colour | color |
{n,m} | Da n a m volte | /\d{2,4}/ | 7 42 1999 123456 | 42 |
(…) | Gruppo di cattura | /(\d+)px/ | width: 320px | 320px |
(?<name>…) | Gruppo di cattura con nome | /(?<h>\d\d):(?<m>\d\d)/ | at 09:45 | 09:45 |
(?:…) | Gruppo senza cattura | /(?:ab)+/ | ababab! | ababab |
a|b | Un lato o l'altro | /cat|dog/ | hotdog | dog |
\b | Confine di parola | /\bcat\b/ | concat cat | cat |
(?=…) | Seguito da (lookahead) | /\d+(?=%)/ | 50 of 75% | 75 |
(?<!…) | Non preceduto da (lookbehind negativo) | /(?<!\$)\b\d+/ | $30 or 40 | 40 |
\p{L} | Qualsiasi lettera Unicode (richiede u) | /\p{L}+/u | naïve 東京 | naïve |
I sei flag e cosa cambiano
g (global) trova tutte le corrispondenze invece di fermarsi alla prima; senza di essa l'elenco contiene un solo elemento. i ignora maiuscole e minuscole. m (multilinea) fa sì che ^ e $ corrispondano all'inizio e alla fine di ogni riga e non soltanto dell'intero testo, cosa utile per un pattern come gli spazi finali. s (dotAll, introdotto in ES2018) permette a . di corrispondere anche ai caratteri di a capo. u (unicode) tratta il testo come punti di codice, quindi un'emoji conta come un solo carattere, e abilita le sequenze di proprietà come \p{L} per qualsiasi lettera di qualsiasi alfabeto. y (sticky) trova corrispondenze solo esattamente nella posizione corrente, la modalità usata dai tokenizer. JavaScript prevede anche d per gli indici delle corrispondenze e v per le operazioni sugli insiemi nelle classi; questo tester si limita alle sei sopra.
Sotto il testo di prova, ogni corrispondenza mostra il proprio indice e i propri gruppi. I gruppi numerati nascono dalle semplici parentesi, (?:…) raggruppa senza catturare e (?<year>\d{4}) crea un gruppo con nome che compare con il suo nome, come mostra l'esempio della data ISO. Il menu Pattern comuni inserisce punti di partenza collaudati per indirizzi email, URL, indirizzi IPv4, colori esadecimali, UUID, parole ripetute e spazi finali. Considerate il pattern per le email un controllo di massima, non una validazione: la grammatica completa degli indirizzi è molto più permissiva e l'unica vera prova è inviare un messaggio.
Lookbehind e backtracking catastrofico
I lookaround verificano ciò che circonda una posizione senza consumarlo. Il lookahead, (?=…) e (?!…), fa parte di JavaScript da sempre; il lookbehind, (?<=…) e (?<!…), è arrivato con ES2018 ed è disponibile in tutti i principali browser da quando Safari 16.4 lo ha introdotto nel 2023. Così (?<=\$)\d+ trova 42 in "$42" senza includere il simbolo del dollaro. A differenza di molti altri motori, JavaScript consente lookbehind di lunghezza qualsiasi.
Il motore di JavaScript usa il backtracking: quando un percorso fallisce, torna indietro e prova le alternative. I quantificatori annidati come (a+)+$ gli offrono un numero esponenziale di modi per suddividere lo stesso testo, quindi una stringa di 30 a seguita da una x può richiedere secondi e qualche lettera in più può richiedere ore. È il backtracking catastrofico, che sui server diventa ReDoS, un attacco denial of service; una singola regola WAF con questo difetto ha messo fuori uso la rete di Cloudflare per circa mezz'ora il 2 luglio 2019. Poiché questo tester gira nella vostra scheda, un pattern simile può bloccare la pagina; ricaricate e riscrivetelo in modo che due quantificatori non possano reclamare gli stessi caratteri, usando classi più strette come [^,]* al posto di .*, oppure ancore. Per modificare il testo anziché cercarvi corrispondenze, vedete gli strumenti per il testo; altre utilità per sviluppatori sono nella sezione strumenti per sviluppatori.
Domande frequenti
- Perché la regex trova una sola corrispondenza?
- Il flag g è disattivato. Senza di esso il motore si ferma dopo la prima corrispondenza. Attivate g per elencare tutte le occorrenze; anche il solo flag y ne trova più d'una, ma solo se si susseguono direttamente.
- In JavaScript \d riconosce le cifre di altri sistemi di scrittura?
- No. In JavaScript \d indica solo da 0 a 9 e \w solo lettere ASCII, cifre e trattino basso, anche con il flag u. Per altri alfabeti usate \p{Nd} o \p{L} con u.
- Un pattern testato qui si comporta allo stesso modo in Python o PHP?
- La sintassi di base è compatibile, ma i dettagli cambiano: in Python i gruppi con nome si scrivono
(?P<name>…), PHP e Python supportano quantificatori possessivi che JavaScript non ha, e le regole del lookbehind variano. Riprovate nel motore di destinazione. - Come si cerca un punto o una parentesi letterale?
- Fate l'escape con una barra rovesciata:
\.corrisponde a un punto e\[a una parentesi quadra aperta. All'interno di una classe di caratteri la maggior parte dei simboli è già letterale, quindi anche[.]corrisponde solo a un punto. - Perché la pagina si è bloccata mentre scrivevo un pattern?
- Probabilmente il pattern ha causato un backtracking catastrofico sul vostro testo. Ricaricate, poi evitate quantificatori annidati come
(.*)*o(a+)+e fate in modo che ogni parte corrisponda al minimo possibile.