Torna al blog

Pubblicato · 9 min di lettura

Regex per non sviluppatori: una guida pratica

Un tutorial regex amichevole e con poco gergo per scrittori, analisti, marketer e chiunque viva di Trova e Sostituisci. Impara la sintassi che conta e ruba dieci ricette pronte all'uso.

Perché un non sviluppatore dovrebbe interessarsi alle regex

Se hai mai aperto la finestra Trova e Sostituisci in Word, Google Docs, Notion, un foglio di calcolo o il tuo editor di testo preferito e pensato "deve esserci un modo più veloce di farlo", sei esattamente il lettore giusto per questa guida. Regex, abbreviazione di espressione regolare, è un piccolo linguaggio di pattern che trasforma Trova e Sostituisci da uno strumento contundente in un bisturi. Invece di cercare una singola parola fissa, descrivi la forma di ciò che stai cercando: "qualsiasi numero di telefono", "ogni riga che inizia con una data", "tutti gli indirizzi email in questa esportazione disordinata".

Le regex hanno la reputazione di essere intimidatorie, principalmente perché i tutorial scritti per programmatori ti lanciano addosso venti simboli nel primo paragrafo. La verità è che puoi essere selvaggiamente produttivo con circa dieci caratteri e una manciata di pattern. Questo articolo ti guida attraverso quel nucleo, poi ti consegna dieci ricette copia-incolla che puoi inserire nella casella Trova e Sostituisci di quasi qualsiasi app moderna oggi.

Nota rapida su dove funzionano le regex: sono supportate in Microsoft Word (con "Usa caratteri jolly" o tramite la più recente ricerca regex), Google Docs ("Corrispondenza usando espressioni regolari"), Notion (limitato), VS Code, Sublime Text, BBEdit, Obsidian, Google Sheets tramite REGEXMATCH e REGEXREPLACE, Excel via Power Query e le nuove funzioni REGEX, e praticamente ogni editor di codice e strumento di test online. Alcune app usano dialetti leggermente diversi, ma il novanta percento di ciò che impari qui funziona ovunque.

Cos'è esattamente una regex?

Un'espressione regolare è un pattern. Consegni il pattern a un motore di ricerca, e questo restituisce ogni pezzo di testo che corrisponde a quel pattern. La regex più semplice possibile è una parola letterale. Il pattern cat trova le lettere c, a, t in quell'ordine. Finora niente di entusiasmante, è solo normale Trova e Sostituisci.

La magia inizia quando mescoli caratteri speciali chiamati metacaratteri. Questi non corrispondono a se stessi; descrivono categorie o regole. Un punto, ad esempio, significa "qualsiasi singolo carattere". Il pattern c.t ora corrisponde a cat, cot, cut, c5t e persino c#t. All'improvviso un pattern fa il lavoro di dozzine di ricerche.

Questo è l'intero modello mentale. Una regex è una stringa letterale di testo dove alcuni caratteri sono potenziati per significare qualcosa di più generale. Impara cosa fanno quei caratteri potenziati e potrai leggere e scrivere quasi qualsiasi pattern incontri.

I mattoni che vale la pena memorizzare

  • . (punto) corrisponde a qualsiasi singolo carattere tranne una nuova riga.
  • * significa "zero o più della cosa precedente". Quindi a* corrisponde a una stringa vuota, a, aa, aaa e così via.
  • + significa "uno o più della cosa precedente". a+ corrisponde a a, aa, aaa, ma non a una stringa vuota.
  • ? significa "zero o uno", cioè opzionale. colou?r corrisponde sia a color che a colour.
  • ^ ancora il pattern all'inizio di una riga. ^Hello trova Hello solo quando inizia una riga.
  • $ ancora alla fine di una riga. \.$ trova ogni riga che termina con un punto.
  • [abc] è una classe di caratteri. Corrisponde a un carattere che è a, b o c. [a-z] corrisponde a qualsiasi lettera minuscola, [0-9] a qualsiasi cifra, [A-Za-z0-9] a qualsiasi lettera o cifra.
  • [^abc] con un caret dentro le parentesi quadre significa "qualsiasi carattere tranne a, b o c".
  • \d è un'abbreviazione per qualsiasi cifra, \w per qualsiasi carattere di parola (lettere, cifre, underscore), \s per qualsiasi spazio bianco (spazio, tab, nuova riga). Le loro controparti maiuscole \D, \W, \S significano l'opposto.
  • Le parentesi tonde ( ) creano un gruppo, sia per applicare quantificatori a più caratteri contemporaneamente sia per catturare testo che vuoi riutilizzare in una sostituzione.
  • Il pipe | significa OR. cat|dog corrisponde a cat o dog.
  • Un backslash \ esegue l'escape di un carattere speciale così che corrisponda letteralmente. Per trovare un punto reale, scrivi \. Per trovare una parentesi letterale, scrivi \(.

Ancore, quantificatori e la trappola greedy

Le ancore (^ e $) sono il segreto per scrivere pattern precisi. Senza di esse, la tua regex galleggia ovunque nel testo e tende a corrispondere a più di quanto volevi. Con esse, ancori il pattern all'inizio o alla fine di una riga, che è di solito esattamente ciò che intendi quando dici "ogni riga che inizia con un numero".

I quantificatori (*, +, ?, e la forma con le parentesi graffe come {2,4}) controllano quante volte si ripete la cosa precedente. La cosa da sapere è che sono greedy per impostazione predefinita: afferrano quanto più possono. Se scrivi <.+> e lo esegui sul testo <b>hi</b>, potresti aspettarti che corrisponda a <b> e </b> separatamente. In realtà corrisponderà all'intero <b>hi</b> in un colpo perché + è greedy. Aggiungi un punto interrogativo, <.+?>, e il quantificatore diventa lazy, corrispondendo il meno possibile. Questo singolo trucco risparmia un'enorme quantità di tempo di debug.

Gruppi e backreference per trova-e-sostituisci

Le parentesi tonde fanno doppio dovere. Primo, ti permettono di quantificare un blocco: (ab)+ corrisponde a ab, abab, ababab. Secondo, e molto più utile, catturano qualsiasi cosa corrispondano in uno slot numerato a cui puoi fare riferimento nel campo di sostituzione. Il primo set di parentesi diventa $1 nella maggior parte degli editor (o \1 in alcuni), il secondo diventa $2 e così via.

Così riordini il testo. Supponiamo che il tuo foglio di calcolo abbia nomi scritti come Cognome, Nome e tu voglia Nome Cognome. Cerca ([A-Za-z]+), ([A-Za-z]+) e sostituisci con $2 $1. Fatto, in un colpo, su migliaia di righe. Quasi ogni ricetta più avanti in questo articolo usa lo stesso trucco, quindi vale la pena prendere confidenza con l'idea: parentesi a sinistra, dollaro-numeri a destra.

Ricetta 1: estrai ogni indirizzo email da testo disordinato

Gli indirizzi email sono ubiqui in esportazioni, blocchi di firma e dump CRM. Questo pattern è un default sensato. Non è perfetto secondo l'RFC (nessuna regex lo è davvero), ma cattura ogni indirizzo realistico in documenti normali.

[\w.+-]+@[\w-]+\.[\w.-]+

Ricetta 2: trova numeri di telefono in qualsiasi formato comune

I numeri di telefono sono un meraviglioso esempio di come la regex domi l'input disordinato. Il pattern qui sotto cattura numeri scritti come 555-123-4567, (555) 123 4567, +1 555.123.4567 e la maggior parte delle varianti intermedie. Aggiusta il + iniziale e il prefisso internazionale se hai bisogno solo di numeri locali.

\+?\d{1,3}?[\s.-]?\(?\d{2,4}\)?[\s.-]?\d{3,4}[\s.-]?\d{3,4}

Ricetta 3: cambia formato data da YYYY-MM-DD a DD/MM/YYYY

Questa è la classica mossa con gruppi e backreference. Cattura ogni parte della data, poi riordinala nel campo di sostituzione. Nella casella Trova incolla il pattern qui sotto; nella casella Sostituisci incolla $3/$2/$1.

(\d{4})-(\d{2})-(\d{2})

Ricetta 4: rimuovi tutte le righe vuote da un documento

Il testo lungo incollato spesso arriva con righe vuote extra che raddoppiano o triplicano il numero di pagine. Il pattern qui sotto corrisponde a una riga che contiene nient'altro che spazio bianco opzionale e una nuova riga. Sostituisci con nulla (lascia vuota la casella Sostituisci) e il tuo documento collassa in righe a interlinea singola.

^\s*\n

Ricetta 5: collassa spazi doppi, tripli o sfuggiti in uno

Le esportazioni OCR, i PDF copiati e i vecchi documenti Word sono noti per spargere spazi doppi tra le parole. Trova due o più spazi consecutivi e sostituisci con un singolo spazio.

 {2,}

Ricetta 6: estrai ogni URL da un blocco di testo

Devi prendere ogni link da un articolo, un'esportazione email o un log di chat? Questo pattern cattura URL http e https, inclusi percorsi e query string. Combinalo con la funzione "copia tutte le corrispondenze" del tuo editor, o incolla le corrispondenze catturate in un nuovo documento.

https?://[\w.-]+(?:/[\w./?=&%#-]*)?

Ricetta 7: capitalizza la prima lettera di ogni nome in una lista

Se hai una colonna piena di nomi digitati in minuscolo (jane doe, mark twain) puoi correggere il case in due passaggi. Primo, trova il pattern qui sotto e cattura la prima lettera di ogni parola. La maggior parte degli editor ti permette poi di sostituire con \u$1 (maiuscolizza la prima cattura). Se il tuo non lo fa, fai passare la lista attraverso un convertitore di case dedicato e riportala. Multilities distribuisce un piccolo case-converter che gestisce questo in un click.

\b([a-z])

Ricetta 8: mantieni solo le righe che contengono un numero

Alcuni editor ti permettono di eliminare ogni riga che non corrisponde a una regex. Combinato con il pattern qui sotto, puoi ridurre un lungo file di log o un documento di note solo alle righe contenenti un numero, che è meraviglioso per ripulire estratti conto bancari incollati da un PDF.

^.*\d+.*$

Ricetta 9: standardizza lo spazio bianco alla fine di ogni riga

Gli spazi finali sono invisibili ma rompono gli strumenti di diff, le firme email e i commenti del codice. Trovali e sostituisci con nulla. Il pattern corrisponde a uno o più spazi o tab che si trovano immediatamente prima della fine di una riga.

[ \t]+$

Ricetta 10: estrai hashtag da un'esportazione social media

I team marketing esportano tweet, post LinkedIn e didascalie Instagram e vogliono contare quali hashtag sono apparsi. Il pattern qui sotto trova un # immediatamente seguito da uno o più caratteri di parola, che cattura ogni hashtag realistico senza trascinarsi dietro la punteggiatura circostante.

#\w+

Come provarli davvero nel tuo strumento

In Google Docs, apri Modifica, poi Trova e sostituisci, e spunta "Corrispondenza usando espressioni regolari". In Microsoft Word, apri la finestra Trova e Sostituisci, espandila e spunta "Usa caratteri jolly" (il dialetto dei caratteri jolly di Word è simile ma non identico, quindi i pattern sopra potrebbero richiedere una modifica lì). In Notion, le regex sono supportate in alcune proprietà di database e tramite integrazioni, ma la barra di ricerca stessa è letterale.

In Google Sheets, avvolgi il pattern in REGEXMATCH, REGEXEXTRACT o REGEXREPLACE: =REGEXEXTRACT(A2, "[\w.+-]+@[\w-]+\.[\w.-]+") estrae l'email dalla cella A2. Le funzioni più recenti di Excel REGEXEXTRACT, REGEXREPLACE e REGEXTEST si comportano in modo simile. In VS Code, Sublime e nella maggior parte degli editor di codice, clicca l'icona .* nella barra di ricerca per passare alla modalità regex.

Quando un pattern si comporta male, non fissarlo. Lascialo cadere in un tester di regex che evidenzia le corrispondenze mentre digiti. Multilities offre un /tools/regex-tester gratuito esattamente per questo, e uno strumento /tools/find-replace che esegue i tuoi pattern su un blocco di testo incollato senza toccare il documento originale. Iterare in un tester richiede secondi; iterare dentro Word con Annulla richiede minuti.

Errori comuni e come evitarli

  • Dimenticare di fare l'escape del punto. Se vuoi un punto letterale (in un nome di dominio, un'estensione di file o una frase), scrivi \. Il punto nudo corrisponde a qualsiasi cosa.
  • Usare .* quando intendi \S+ o [^,]+. Il pattern dot-star è greedy e spesso mangia più di quanto volevi, specialmente attraverso virgole, virgolette o tag HTML.
  • Ancorare con ^ e $ ma dimenticare che ^ e $ funzionano per riga in alcuni strumenti e per documento in altri. Se ottieni corrispondenze inattese, controlla se il tuo editor ha un toggle "multiline" o "dotall".
  • Mescolare dialetti. JavaScript, Python, PCRE, caratteri jolly Word e regex POSIX condividono la maggior parte della sintassi ma differiscono sui casi limite come lookaround e gruppi nominati. Quando qualcosa smette di funzionare in un'app, il dialetto è solitamente la causa.
  • Non usare le parentesi per la sostituzione. Se vuoi mantenere parte di ciò che hai trovato, devi catturarlo. Senza parentesi non puoi fare riferimento a nulla con $1 o \1.

Un breve flusso di lavoro che ti renderà veloce

Quando devi pulire un documento, non iniziare scrivendo la regex perfetta. Inizia selezionando due o tre righe di esempio del testo disordinato e incollandole in un tester di regex. Digita una versione letterale di un esempio, poi aggiorna un pezzo alla volta: sostituisci le cifre con \d+, sostituisci il nome variabile con \w+, sostituisci la punteggiatura che è autorizzata a variare con una classe di caratteri. Dopo ogni aggiornamento, controlla che il testo di test corrisponda ancora e che tu non abbia iniziato a catturare cose che non volevi.

Una volta che il pattern è giusto, copialo nella casella Trova del documento reale ed esegui una singola sostituzione per vedere se si comporta allo stesso modo su scala. Se il documento è importante, lavora su una copia e usa Annulla aggressivamente. Entro una settimana di farlo due o tre volte inizierai a scrivere pattern a memoria per le pulizie che fai più spesso, e la prima cosa a cui ricorrerai in qualsiasi esportazione disordinata non sarà più un manuale click-click-click ma un piccolo pattern che fa tutto in una volta.

Dove andare da qui

I pattern e le ricette sopra copriranno la stragrande maggioranza dei compiti quotidiani di pulizia, estrazione e riformattazione del testo. Quando sei pronto ad andare più a fondo, cerca lookahead ((?=...)), lookbehind ((?<=...)), gruppi non catturanti ((?:...)) e catture nominate ((?<year>\d{4})). Non sono necessari per il lavoro quotidiano, ma sbloccano pattern più eleganti quando incontri testo genuinamente complicato.

La regex premia la pratica breve e frequente più di qualsiasi altra abilità tecnica. Tieni un file di note con le cinque ricette a cui ricorri di più, incolla quelle nuove man mano che le scopri, e nel giro di pochi mesi sarai la persona dell'ufficio a cui tutti chiedono quando il loro foglio di calcolo è un pasticcio. È un posto sorprendentemente bello in cui trovarsi.

Prova questi strumenti