Tester di espressioni regolari
Scrivi un pattern, guardalo corrispondere al tuo testo mentre digiti, e vedi esattamente cosa fa ogni token. Gruppi di cattura, un'anteprima di sostituzione, e un controllo di portabilità per PCRE e Python.
Pattern
La tua espressione regolare
Scrivi solo il corpo del pattern — senza slash intorno. Tutto si aggiorna mentre digiti.
Cambia solo il controllo di portabilità — il matching viene sempre eseguito sul motore JavaScript del tuo browser.
Preset
Testo di prova
Testo su cui verificare la corrispondenza
Incolla dati reali — una riga di log, una config, un export di chat. Niente esce dal tuo browser.
794 caratteri · 14 righe
Wespner ops log — node eu-fra-03 Ticket #4821 opened by [email protected], escalated to [email protected]. Billing contact: [email protected] (invoice WX-2026-0917). Panel: https://panel.wespner.eu/server/eu-fra-03/console Mirror: http://mirror.wespner.eu:8080/backups/latest.tar.zst Node IP 185.199.110.153, gateway 10.0.0.1, bad entry 999.1.1.1 in the allowlist. Server UUID 9f2c1a7e-3b44-4d8e-9c21-7a5f0b6e2d13 (instance 550e8400-e29b-41d4-a716-446655440000). Chat export: [12:04] Steve_84: this build is hell to maintain, honestly [12:05] Alex_MC: rotate the panel password and open a shell on the class-4 node [12:06] Steve_84: damn, the ass-end of that config is unreadable [12:07] Notch_Fan: <img src=x onerror=alert(1)> nice try [12:08] Alex_MC: harassment report filed, see /docs/rcon
Gruppi di cattura
Ogni corrispondenza, con i suoi gruppi e le sue posizioni
I gruppi numerati provengono da semplici ( ). I gruppi con nome provengono da (?<nome>…) e sono elencati separatamente.
Inserisci un pattern per vedere le corrispondenze e i loro gruppi di cattura.
Modalità spiegazione
Cosa fa realmente ogni pezzo del pattern
Leggi dall'alto verso il basso — è l'ordine in cui lo legge il motore. L'indentazione mostra l'annidamento dentro i gruppi.
(?<user>Named capturing group “user”, also group number 1. Refer to it as $<user> in a replacement, or \k<user> in the pattern.[\w.+-]Any single character that is a word character (letter, digit or underscore), “.”, “+” or “-”.+Repeats the previous token one or more times. Greedy: it takes as much as it can, then hands characters back one at a time if the rest of the pattern fails.)Closes the group opened above.@The character “@”, matched literally.(?<domain>Named capturing group “domain”, also group number 2. Refer to it as $<domain> in a replacement, or \k<domain> in the pattern.(?:Non-capturing group: groups tokens together for a quantifier or an alternation without storing what it matched, so it does not consume a group number.[\w-]Any single character that is a word character (letter, digit or underscore) or “-”.+Repeats the previous token one or more times. Greedy: it takes as much as it can, then hands characters back one at a time if the rest of the pattern fails.\.The character “.”, matched literally. The backslash strips any special meaning it would otherwise have.)Closes the group opened above.+Repeats the previous token one or more times. Greedy: it takes as much as it can, then hands characters back one at a time if the rest of the pattern fails.[a-z]Any single character that is anything from “a” to “z”.{2,}Repeats the previous token at least 2 times, with no upper limit. Greedy: it takes as much as it can, then hands characters back one at a time if the rest of the pattern fails.)Closes the group opened above.giFlags: g finds every match instead of stopping at the first; i ignores letter case.Sostituisci
Anteprima di trova e sostituisci
Usa $1, $2 per i gruppi numerati, $<nome> per quelli con nome, $& per l'intera corrispondenza e $$ per un segno di dollaro letterale.
Risultato
Inserisci un pattern per l'anteprima di una sostituzione.
Nota di onestà
Questa pagina non esegue PCRE o Python
Qui c'è un solo motore regex: quello integrato nel tuo browser, che implementa la variante di JavaScript. Selezionare PCRE o Python non cambia motore e non può farlo — nessun PCRE o CPython gira in questa scheda.
Ciò che fa invece l'impostazione della variante è controllare il tuo pattern per costrutti che sono scritti diversamente, si comportano diversamente, o semplicemente non esistono nella variante che hai scelto. Considera le corrispondenze sopra come risultati JavaScript, e l'elenco a destra come "cosa ti morderà quando lo incollerai in PHP o Python".
Chiamata equivalente
const re = /(?<user>[\w.+-]+)@(?<domain>(?:[\w-]+\.)+[a-z]{2,})/gi;
for (const m of text.matchAll(re)) console.log(m);A literal is fine when the pattern is fixed. Building one from a variable needs new RegExp(src, flags) — and the source escaped first.
Controllo di portabilità
Portabilità verso JavaScript
Euristico — il pattern viene scansionato come testo, quindi un costrutto scritto dentro una classe di caratteri potrebbe comunque essere segnalato.
Cheat sheet
Greedy vs. lazy
Il motivo più comune in assoluto per cui un pattern "corrisponde troppo".
<.*> contro <b>bold</b> corrisponde all'intera stringa, non solo a <b>. * e + sono greedy (avidi): prendono tutto ciò che possono e restituiscono caratteri solo quando il resto del pattern fallisce.
Aggiungi ? per rendere lazy un quantificatore — <.*?> si ferma al primo >. Di solito è ancora meglio dire cosa intendi davvero, <[^>]*>, che non può mai attraversare il delimitatore e non fa backtracking.
Cheat sheet
Ancoraggi e confini
^ e $ sono l'inizio e la fine della stringa — finché non aggiungi il flag m, quando diventano l'inizio e la fine di ogni riga. Dimenticare m su un file di config multi-riga è il motivo per cui un pattern per-riga a volte non corrisponde a nulla in silenzio.
\b è un confine di parola a larghezza zero, non un carattere. \bcat\b corrisponde a cat ma non a concatenate. Dentro una classe di caratteri [\b] significa backspace invece — una trappola vera e propria.
Un pattern che deve corrispondere all'intero input ha bisogno di entrambi gli ancoraggi. ^\d+ da solo corrisponde felicemente all'inizio di 123abc.
Cheat sheet
Backtracking catastrofico
Quantificatori annidati dove la parte interna ed esterna possono corrispondere allo stesso testo — (a+)+$, (\w+\s?)*$, (\d+)*x — danno al motore esponenzialmente tanti modi di suddividere l'input. Su una stringa che fallisce, ogni carattere in più circa raddoppia il lavoro, quindi 30 caratteri possono richiedere minuti.
La soluzione è rimuovere l'ambiguità: (a+)+ diventa a+; (\w+\s?)* diventa \w+(?:\s\w+)*. Dove il tuo motore li supporta, un gruppo atomico (?>…) o un quantificatore possessivo a++ vieta del tutto il backtracking — PCRE e Python 3.11+ li hanno entrambi, JavaScript nessuno dei due.
Questo tester esegue il matching in un Web Worker con un limite di tempo, così un pattern fuori controllo si interrompe invece di bloccare la scheda. Il tuo server di produzione non ha una rete di sicurezza del genere.
Cheat sheet
Filtri di parole e il problema di Scunthorpe
Un elenco di parole senza confini corrisponde anche dentro parole innocenti. Il caso canonico è la città inglese di Scunthorpe, i cui abitanti sono stati bloccati dalla registrazione a vari servizi per anni a causa delle quattro lettere al centro del suo nome.
Più vicino a casa: hell corrisponde a shell, ass corrisponde a class e password, doc corrisponde a document. Racchiudere l'alternanza in \b(?:…)\b risolve la maggior parte del problema. Non risolverà l'elusione deliberata (h e l l, h3ll), e inseguirla con le regex produce più falsi positivi di quanti ne prevenga — motivo per cui la vera moderazione abbina una regex piccola e conservativa a una revisione umana.
Cheat sheet
Escaping, classi e il punto
Dentro [ ] la maggior parte dei metacaratteri perde il suo potere: [.+*] sono tre caratteri letterali. Solo ^ (in prima posizione), - (tra caratteri) e il backslash restano speciali, e ] deve essere escapato.
Il punto significa "qualsiasi carattere tranne un a capo" finché non aggiungi s. In un pattern per IP o versione, un punto non escapato corrisponde a qualsiasi cosa — 1.2.3.4 corrisponde anche a 1x2y3z4.
Quando costruisci un pattern a partire da input utente, escapalo prima. In JavaScript: s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"). In PHP preg_quote(), in Python re.escape().
Cheat sheet
Gruppi che probabilmente vuoi non-catturanti
Ogni ( ) memorizza la sua corrispondenza e rinumera tutto ciò che viene dopo. Se ti serve il raggruppamento solo per un'alternanza o un quantificatore, usa (?:…) — mantiene stabile il tuo $1 quando in seguito aggiungi un gruppo davanti.
I gruppi con nome (?<user>…) sopravvivono interamente al riordino, e si leggono molto meglio in una stringa di sostituzione: $<user> invece di $3. Python li scrive (?P<user>…).
Gestisci un tuo server di gioco?
Server di gioco Wespner con protezione DDoS, dischi NVMe e attivazione in pochi minuti.