Tester di Regex

Scrivi un'espressione regolare, incolla un testo di prova e guarda le corrispondenze evidenziate in tempo reale — con gruppi di cattura, flag e messaggi di errore chiari.

1.045 visualizzazioni

Come Funziona

Un'espressione regolare descrive uno schema di caratteri invece di una stringa letterale, permettendo a una breve espressione di corrispondere a un'intera famiglia di testi: qualsiasi indirizzo email, qualsiasi numero di telefono in diversi formati, qualsiasi riga di un file di log che inizi con "ERROR". Digita un'espressione regolare JavaScript, attiva i suoi flag (g tutte le corrispondenze, i senza distinzione tra maiuscole e minuscole, m ancore multilinea, s il punto corrisponde anche agli a-capo, u Unicode completo) e incolla un testo di esempio: ogni corrispondenza viene evidenziata sul posto ed elencata sotto con la sua posizione ed eventuali gruppi di cattura. Le parentesi () creano un gruppo di cattura — un modo per estrarre una parte specifica del testo corrispondente, come il dominio da un indirizzo email o l'anno da una data, invece di sapere soltanto che una corrispondenza si è verificata.

Una distinzione che inganna quasi tutti all'inizio: quantificatori avidi (greedy) contro pigri (lazy). .* è avido — cerca di corrispondere quanto più testo possibile, e torna indietro (backtrack) solo se necessario. Contro l'input <b>bold</b> and <i>italic</i>, il pattern <.*> corrisponde avidamente dal primo < fino all'ultimissimo >, inghiottendo entrambi i tag. Aggiungere un ? per ottenere .*? lo rende pigro — corrisponde al minimo possibile, così <.*?> si ferma al primo > e corrisponde correttamente solo a <b>. Questa distinzione è esattamente il motivo per cui le regex ingenue per l'HTML si rompono su markup reale.

Cosa Dovresti Sapere

Il motore qui è l'implementazione nativa JavaScript (ECMAScript) del tuo stesso browser, quindi un pattern che corrisponde qui corrisponde in modo identico nel tuo codice JS — non c'è alcun livello di traduzione da mettere in dubbio. Le varianti regex di altri linguaggi — PCRE (PHP), il re di Python, Pattern di Java — condividono gran parte della sintassi di base (classi di caratteri, quantificatori, gruppi) ma divergono sulle funzionalità avanzate: supporto al lookbehind, sintassi dei gruppi con nome, quantificatori possessivi e alcune sequenze di escape differiscono. Ritesta sempre i casi limite nel linguaggio di destinazione reale prima di mettere in produzione.

Fai attenzione al backtracking catastrofico: pattern con quantificatori annidati o sovrapposti, come (a+)+b testato contro una lunga stringa di caratteri "a" senza una "b" finale, possono costringere il motore a un backtracking esponenziale e bloccare la pagina — o il tuo server di produzione, per lo stesso motivo. Se un pattern si blocca qui, accorcia prima il testo di prova, poi ristruttura il pattern (spesso rimuovendo del tutto la ripetizione annidata) invece di limitarti a gettarci sopra più potenza di calcolo. Tutto viene eseguito localmente nel tuo browser; nessun pattern o testo viene mai trasmesso.

Domande Frequenti

Quale variante di regex viene usata?

JavaScript (ECMAScript) — il motore nativo del browser. I pattern si comportano esattamente come nel tuo codice JS; PCRE e Python condividono gran parte della sintassi ma differiscono in alcuni costrutti avanzati.

Cosa significano i flag?

g trova tutte le corrispondenze invece della sola prima; i ignora maiuscole/minuscole; m fa sì che ^ e $ corrispondano per riga; s fa sì che il punto corrisponda anche agli a-capo; u abilita la gestione completa di Unicode.

Perché il mio pattern blocca la pagina?

Alcuni pattern con quantificatori annidati (come (a+)+b) possono generare un backtracking catastrofico su testi lunghi. Accorcia il testo di prova o ristruttura il pattern — lo stesso blocco si verificherebbe nel tuo codice in produzione.

Cos'è un gruppo di cattura e perché è importante?

Le parentesi attorno a una parte di un pattern creano un gruppo di cattura, che estrae quella sottostringa specifica separatamente dalla corrispondenza completa — per esempio (\d{4})-(\d{2})-(\d{2}) confrontato con una data restituisce anno, mese e giorno come tre catture individuali invece di limitarsi a confermare che l'intera stringa somigliasse a una data. I gruppi non catturanti, scritti (?:...), raggruppano per struttura senza produrre una cattura extra.

Perché il mio pattern ha corrisposto a più (o meno) testo del previsto?

Quasi sempre è una confusione tra avido e pigro. .* e quantificatori simili afferrano quanto più possibile per impostazione predefinita; aggiungi un ? (.*?, +?) per renderli pigri e fermarsi al primo punto possibile invece che all'ultimo. Questo singolo carattere è di solito la soluzione quando una regex corrisponde a troppo testo su più righe o tag.

Commenti

Ancora nessun commento — scrivi il primo!

Strumenti Simili