Testare un'espressione regolare

testa un'espressione regolare (regex) su un testo e mostra le corrispondenze e i gruppi catturati

A cosa serve un tester di espressioni regolari?

Un regex tester permette di verificare che un pattern di espressione regolare (regex) corrisponda effettivamente al testo atteso, senza dover lanciare il codice applicativo. Si incolla il pattern, si incolla il testo di input, si spuntano le opzioni (flag), e lo strumento mostra immediatamente l'elenco delle corrispondenze trovate così come i gruppi catturati. È l'equivalente online di preg_match_all() in PHP, di String.matchAll() in JavaScript o di re.findall() in Python.

Le regex sono al tempo stesso potenti e infide. Una virgola, una parentesi mal posizionata, un quantificatore greedy che aspira troppi caratteri: e la stringa estratta non è più quella che ci si aspettava. Il tester evita l'andata e ritorno con un editor, un terminale e un file di test: si itera il pattern finché si vede il risultato giusto.

Come scrivere il pattern?

Inserite la regex senza i delimitatori. Niente /.../, niente #...#. Per esempio, per catturare gli indirizzi email di un testo, inserite solo [\w.+-]+@[\w-]+\.[\w.-]+. Le opzioni (flag) sono controllate dalle caselle da spuntare.

L'opzione u (Unicode) è spuntata per default. È quasi sempre desiderata: senza, \w non riconosce gli accenti, e alcuni pattern restituiscono un errore PCRE silenzioso sulle stringhe UTF-8.

Le opzioni PCRE

  • i (case-insensitive): [a-z] riconosce anche le maiuscole.
  • m (multiline): ^ e $ matchano gli inizi e le fini di ogni riga, non solo l'inizio e la fine della stringa globale.
  • s (dotall): . riconosce anche i ritorni a capo. Utile per pattern che devono attraversare paragrafi.
  • u (unicode): interpreta il pattern e il soggetto in UTF-8. Indispensabile non appena il testo contiene caratteri non-ASCII (accenti, emoji, ideogrammi).

Esempi di regex comuni

  • Indirizzo email: [\w.+-]+@[\w-]+\.[\w.-]+ (forma semplificata, sufficiente per la maggior parte dei casi pratici; la RFC 5322 stretta è molto complessa).
  • URL HTTP/HTTPS: https?://[\w.-]+(?:/[\w./?%&=-]*)?
  • Numero di telefono italiano: (?:\+39|0)\s?[1-9](?:[\s.-]?\d{2}){4}
  • Codice postale italiano: \b\d{5}\b
  • Data ISO (YYYY-MM-DD): \b\d{4}-\d{2}-\d{2}\b
  • Indirizzo IPv4: \b(?:\d{1,3}\.){3}\d{1,3}\b
  • Parola intera: \bfoo\b (i word boundary evitano di matchare football).
  • Hashtag: #\w+
  • Numero di versione semantica: \d+\.\d+\.\d+(?:-[\w.-]+)?
  • Identificatore Twitter / X: @\w{1,15}

Gruppi catturati

Una regex può contenere gruppi tra parentesi, che isolano una porzione del match per riutilizzarla. Per esempio, il pattern (\w+)@(\w+\.\w+) applicato a alice@example.com cattura due gruppi: alice ed example.com. Lo strumento mostra questi gruppi in una colonna dedicata, a fianco di ogni match. I gruppi nominati ((?P<name>...)) sono ugualmente elencati, indicizzati per nome.

Per raggruppare senza catturare (utile per applicare un quantificatore senza inquinare l'elenco dei gruppi), si usa (?:...).

Protezione contro il ReDoS

Il motore PCRE di PHP può entrare in catastrophic backtracking su certi pattern patologici: un pattern come (a+)+$ applicato a una lunga stringa di a non terminata può bloccare il server per diversi secondi. Per evitare questo denial of service tramite espressione regolare (ReDoS), lo strumento applica due limiti:

  • un set_time_limit(2) lato worker (l'elaborazione abbandona dopo 2 secondi);
  • una riduzione di pcre.backtrack_limit a 100 000, il che fa fallire rapidamente i pattern che esplorano troppe combinazioni.

In caso di pattern troppo costoso, lo strumento mostra il messaggio di errore PCRE (preg_last_error_msg()), tipicamente Backtrack limit was exhausted. Riformulate il vostro pattern usando quantificatori possessivi (a++) o gruppi atomici ((?>...)) per evitare il backtracking.

Domande frequenti

Perché la mia regex non matcha mentre funziona in JavaScript?

Il motore di questo strumento è PCRE (PHP), vicino a Perl. La sintassi è molto simile a JavaScript ma alcune funzionalità differiscono: i lookbehind di lunghezza variabile, certi alias Unicode, o la gestione per default della sensibilità alle maiuscole. Se contate di eseguire il pattern lato browser, testate anche in un ambiente JS.

Perché il mio \w non cattura gli accenti?

Senza il flag u, \w riconosce solo [A-Za-z0-9_]. Con u (Unicode), riconosce tutte le lettere nel senso UCD, inclusi i caratteri accentati. Per andare oltre, usate le classi Unicode: \p{L} (lettera), \p{N} (cifra), \p{P} (punteggiatura).

Lo strumento conserva il mio testo?

No. Il pattern e il soggetto sono elaborati in RAM dal worker PHP, senza persistenza. Nessun dato sottomesso viene loggato.

Cosa fare se ricevo un messaggio "Backtrack limit was exhausted"?

Il vostro pattern fa troppi ritorni indietro. Cercate i nested quantifier del tipo (a+)+ o (\w+)*, che sono casi tipici di ReDoS. Sostituiteli con una forma non ambigua: per esempio \w+ invece di (\w+)*.

Posso testare un pattern multiriga?

Sì. Spuntate l'opzione m affinché ^ e $ riconoscano gli inizi e le fini di ogni riga. Spuntate inoltre s se volete che . attraversi i ritorni a capo.

Esempio di richiesta

curl -X POST https://cdrn.fr/api/v1/tools/regex-tester/execute \
  -H "Content-Type: application/json" \
  -d '{"pattern":"...","subject":"...","flag_i":false,"flag_m":false,"flag_s":false,"flag_u":true}'

Schema di input

Campo Tipo Richiesto Predefinito
pattern string
subject text
flag_i boolean false
flag_m boolean false
flag_s boolean false
flag_u boolean true

Endpoint

  • GET https://cdrn.fr/api/v1/tools - elenca tutti gli strumenti disponibili
  • GET https://cdrn.fr/api/v1/tools/regex-tester - recupera lo schema di questo strumento
  • POST https://cdrn.fr/api/v1/tools/regex-tester/execute - esegue questo strumento con un payload JSON