# Compila glob in regex: gitignore, npmignore, dockerignore

> Testa pattern glob online (* ** ? [abc] {a,b}) contro una lista di path. Compatibile con .gitignore, .npmignore, .dockerignore. Mostra regex compilata.

Strumento gratuito nel browser (nessun upload): https://www.mauriziofonte.it/strumenti/glob-pattern-tester

Testa **pattern glob** contro una lista di path. Sintassi compatibile con i pattern di `.gitignore`, `.npmignore` e `.dockerignore`: `*` (any non-slash), `**` (any incluso slash), `?` (single char), `[abc]` (char set), `[!abc]` (negated set), `{a,b,c}` (alternation). Ogni riga della lista viene testata e mostrata color-coded match/no-match. Visualizza inoltre la regex equivalente compilata dal glob, copiabile e riusabile in script bash, Python o JavaScript. Per il regex full-power c'è il [regex tester](/strumenti/regex-tester) dedicato.

## Come testare un pattern glob

1. **Inserisci il pattern** - Sintassi tipica: `**/*.js` (tutti i.js anche annidati), `src/**/*.{ts,tsx}` (tutti i TypeScript dentro src), `**/node_modules/**` (tutto sotto node_modules a qualsiasi livello), `logs/[!.]*` (file in logs eccetto dotfile).
2. **Incolla la lista di path** - Una path per riga. Tipicamente output di `find. -type f` oppure `git ls-files`. Path relativi o assoluti, slash o backslash; il tester normalizza separatori.
3. **Bottone 'Testa'** - Match e no-match colorati: verde = match (verrà incluso/escluso), grigio = no-match. Stats in alto: totale, match count, no-match count. Regex compilata visibile sotto, utile per copiare in script bash con `=~` o JS con `RegExp`.
4. **Itera fino a coverage** - Edita pattern, ri-testa. Tipico flow: parti da pattern restrittivo, allarga finché tutti i file desiderati matchano. Per `.gitignore` hardcoda i path che NON vuoi committare e verifica che i file desiderati siano fuori.

## Perché un tester dedicato

**Il problema con.gitignore.** Sintassi simile ma non identica al glob shell: i pattern senza slash matchano a qualsiasi profondità (`*.log` matcha `logs/foo.log`); pattern con slash sono path-relative; `**` ha semantica specifica (match cross-directory). Errori comuni: `foo/` include solo directory, `!foo` esclude pattern precedenti. Tester aiuta a capire perché un file viene committato (o non lo è). Nota: questo tool implementa il subset minimatch / shell glob, NON le regole speciali piene di.gitignore (es. negation chains).

**Il problema con minimatch.** Bundle JS ~10KB, ma 90% degli use case usano solo i 5-6 metacaratteri base (`*`, `**`, `?`, `[]`, `{}`). Qui il glob passa da picomatch, lo stesso motore di molti strumenti Node, caricato solo su questa pagina: copre anche i casi edge (extglob: `!(foo|bar)`, `?(...)`, `+(...)`).

**Compile to regex.** Il tester converte il glob in regex e poi testa con `RegExp.test()`. La regex è visibile, copiabile, riusabile nel codice (Python `re.match`, JS `/.../.test()`). Comodo per debug di pattern complessi: se il glob fa match strani, leggi la regex compilata e identifica l'errore.

## Glossario

- **Glob**: Pattern matching language semplificato per file path, originato da Unix shell. Subset di regex con metacaratteri specifici per directory (`*`, `**`) e file (`?`, `[]`, `{}`).
- **minimatch**: Libreria JavaScript open source per glob matching, dipendenza di npm, yarn, eslint, jest e di buona parte dell'ecosistema Node. Implementa la grammatica completa dei pattern glob inclusi gli extglob estesi (negazione, ripetizione).
- **extglob**: Estensione bash 4+ con pattern `!(foo)`, `?(foo)`, `+(foo)`, `*(foo)`, `@(foo)`. Non supportato da questo tester (use case raro).
- **.gitignore**: File con regole glob che dicono a git quali file NON tracciare. Sintassi simile shell glob ma con regole specifiche: `!` per negation, `/` path-anchor, `**` per cross-directory match.
- **Path normalization**: Conversione di separatori path: Windows `\` -> `/`. I path con backslash vengono normalizzati prima del match. Trailing slash ignorato.
- **Brace expansion**: Sintassi `{a,b,c}` che espande in 3 alternative. Non è regex (regex usa `(a|b|c)`). Glob compilato espande in regex group con OR.

## Domande frequenti

### Il tester è compatibile al 100% con minimatch?

No, subset. Implementa `* ** ? [] [!] {}`, range, extglob (`!()`, `?()`, `+()`, `*()`, `@()`), escape con `\` e negazione con `!` in testa (il risultato si inverte). Il motore è picomatch, con i dotfile inclusi. Restano fuori le opzioni `nocase` e `noglobstar`.

### Posso testare pattern.gitignore?

Sì, attivando **Semantica .gitignore**: un pattern senza slash vale a ogni profondità (`*.log` prende `logs/foo.log`), `build/` prende la cartella e tutto il contenuto, `/root.txt` è ancorato alla radice, `!` inverte. Il tool prova un pattern alla volta: la precedenza fra più righe di un file .gitignore la verifichi con `git check-ignore -v file/path`.

### Path con spazi funzionano?

Sì, il tool tratta ogni linea come un path letterale. Spazi nei path sono caratteri normali. Niente bisogno di quoting/escape.

### Match è case-sensitive?

Sì, sempre. Per case-insensitive, normalizza prima la lista (es. tutto lowercase) e usa pattern lowercase. Non c'è flag di compilazione qui.

### Come testo che un pattern NON matcha?

Aggiungi alla lista i path che vuoi escludere e verifica che siano in 'No match'. Per testing inverso (matchare path che il pattern NON deve catturare): pattern complementare costruito a mano, pattern union (`{a,b,c}`), oppure passa a regex tester.

### Il pattern viene compilato a regex: posso copiarla?

Sì, la regex è mostrata sotto la lista risultati. È una regex JavaScript: funziona anche in PHP `preg_match` e in Python `re`, ma usa lookahead, quindi non va bene per il `=~` di bash, che accetta solo regex POSIX estese.

### Limite di righe nella lista?

Tecnicamente nessuno, ma per liste >10000 path il render diventa lento. Per dataset enormi: filtra prima la lista (es. solo file di interesse) o usa `find... | grep -E ''` da terminale.

---
Uno strumento di Maurizio Fonte, senior backend engineer. Tutti gli strumenti: https://www.mauriziofonte.it/strumenti/
