Come utilizzare le espressioni regolari di base per cercare meglio e risparmiare tempo
Sia che tu stia cercando con Grep o guardando programmi che possono rinominare automaticamente i file per te, probabilmente ti sei chiesto se esistesse un modo più semplice per portare a termine il tuo lavoro. Per fortuna, c'è, e si chiama "espressioni regolari".
(Comico da XKCD.com)
Cosa sono le espressioni regolari?
Le espressioni regolari sono dichiarazioni formattate in un modo molto specifico e possono rappresentare molti risultati diversi. Conosciuto anche come "regex" o "regexp", vengono utilizzati principalmente nelle funzioni di ricerca e denominazione dei file. Una regex può essere utilizzata come una formula per creare un numero di diversi output possibili, che vengono tutti ricercati. In alternativa, è possibile specificare il modo in cui un gruppo di file deve essere denominato specificando un'espressione regolare e il software può spostarsi in modo incrementale al successivo output previsto. In questo modo, puoi rinominare più file in più cartelle in modo semplice ed efficiente e puoi andare oltre le limitazioni di un semplice sistema di numerazione.
Poiché l'uso delle espressioni regolari si basa su una sintassi speciale, il tuo programma deve essere in grado di leggerli e analizzarli. Molti programmi di ridenominazione di file batch per Windows e OS X hanno il supporto per le espressioni regolari, nonché lo strumento di ricerca multipiattaforma GREP (che abbiamo esaminato nella nostra guida Bash Scripting per principianti) e lo strumento da riga di comando Awk per * Nix. Inoltre, molti gestori di file, strumenti di avvio e strumenti di ricerca alternativi li usano e hanno un ruolo molto importante in linguaggi di programmazione come Perl e Ruby. Altri ambienti di sviluppo come .NET, Java e Python, così come l'imminente C ++ 11, forniscono tutti librerie standard per l'utilizzo di espressioni regolari. Come puoi immaginare, possono essere davvero utili quando si tenta di ridurre al minimo la quantità di codice inserito in un programma.
Una nota sui caratteri di escape
Prima di mostrarti degli esempi, vorremmo segnalare qualcosa. Useremo la shell bash e il comando grep per mostrarti come applicare le espressioni regolari. Il problema è che a volte vogliamo usare caratteri speciali che devono essere passati a grep, e la shell bash interpreterà quel carattere perché anche la shell lo usa. In queste circostanze, dobbiamo "sfuggire" a questi personaggi. Ciò può creare confusione perché questa "fuga" di caratteri si verifica anche all'interno delle espressioni regolari. Ad esempio, se vogliamo inserire questo in grep:
\<
dovremo sostituirlo con:
\\\<
Ogni personaggio speciale qui ha una barra rovesciata. In alternativa, puoi anche utilizzare le virgolette singole:
'\<'
Le singole virgolette dicono a BASH di non interpretare cosa c'è dentro di loro. Anche se richiediamo di eseguire questi passaggi in modo che possiamo dimostrare per te, i tuoi programmi (specialmente quelli basati su GUI) spesso non richiedono questi passaggi aggiuntivi. Per mantenere le cose semplici e dirette, l'espressione regolare verrà data come testo citato, e vedrai la sintassi di escape nelle schermate della riga di comando.
Come si espandono?
I regexps sono un modo davvero sintetico per dichiarare i termini in modo che il tuo computer possa espanderli in più opzioni. Diamo un'occhiata al seguente esempio:
Tom [0123456789]
Le parentesi quadre - [e] - dicono al motore di analisi che qualsiasi cosa sia dentro, qualsiasi carattere UNICO può essere usato per abbinare. Qualunque cosa ci sia dentro queste parentesi è chiamato set di caratteri.
Quindi, se avessimo un enorme elenco di voci e abbiamo usato questo regex per la ricerca, i seguenti termini sarebbero stati abbinati:
- tom
- tom0
- tom1
- tom2
- tom3
e così via. Tuttavia, il seguente elenco NON sarebbe abbinato, e quindi NON comparirebbe nei tuoi risultati:
- pomodoro ; la regex non tiene conto di nessuna lettera dopo "tom"
- Tom; la regex è case sensitive!
Puoi anche scegliere di cercare con un punto (.) Che permetta a qualsiasi personaggio presente, purché vi sia un personaggio presente.
Come puoi vedere, grepping con
.tom
non ha sollevato termini che avevano solo "tom" all'inizio. Anche i "pomodori verdi" sono entrati, perché lo spazio prima di "tom" conta come un personaggio, ma termini come "tomF" non avevano un carattere all'inizio e sono stati quindi ignorati.
Nota: il comportamento predefinito di Grep è di restituire un'intera riga di testo quando una parte corrisponde alla tua espressione regolare. Altri programmi potrebbero non farlo, e puoi disattivarlo in grep con il flag '-o'.
Puoi anche specificare l'alternanza usando una pipe (|), come qui:
speciali (s | z) e
Questo troverà entrambi:
- specializzarsi
- specializzarsi
Quando si utilizza il comando grep, è necessario sfuggire ai caratteri speciali (, |, e) con barre retroverse e utilizzare il flag '-E' per farlo funzionare ed evitare errori brutti.
Come abbiamo detto sopra, questo è dovuto al fatto che dobbiamo dire alla shell bash di passare questi caratteri a grep e di non fare nulla con loro. Il flag '-E' dice a grep di usare le parentesi e le pipe come caratteri speciali.
Puoi cercare per esclusione usando un cursore che si trova all'interno delle parentesi quadre e all'inizio di un set:
Tom [^ F | 0-9]
Di nuovo, se usi grep e bash, ricorda di sfuggire a quel tubo!
I termini che erano nella lista ma NON sono visualizzati sono:
- tom0
- tom5
- tom9
- tomF
Questi non corrispondevano alla nostra regex.
Come posso utilizzare gli ambienti?
Spesso, cerchiamo in base ai limiti. A volte vogliamo solo stringhe che appaiono all'inizio di una parola, alla fine di una parola o alla fine di una riga di codice. Questo può essere fatto facilmente usando ciò che chiamiamo ancore.
L'uso di un segno di omissione (al di fuori delle parentesi) consente di designare "l'inizio" di una linea.
^ tom
Per cercare la fine di una riga, usa il simbolo del dollaro.
tom $
Puoi vedere che la nostra stringa di ricerca arriva PRIMA dell'ancora in questo caso.
Puoi anche cercare le corrispondenze all'inizio o alla fine delle parole, non le righe intere.
\
tom \>
Come abbiamo menzionato nella nota all'inizio di questo articolo, dobbiamo sfuggire a questi caratteri speciali perché stiamo usando bash. In alternativa, puoi anche utilizzare le virgolette singole:
I risultati sono gli stessi. Assicurati di utilizzare le virgolette singole e non le doppie virgolette.
Altre risorse per regexps avanzati
Abbiamo solo colpito la punta dell'iceberg qui. Puoi anche cercare termini di denaro delineati dall'indicatore di valuta e cercare uno dei tre o più termini corrispondenti. Le cose possono diventare davvero complicate. Se sei interessato a saperne di più sulle espressioni regolari, ti preghiamo di dare un'occhiata alle seguenti fonti.
- Zytrax.com ha alcune pagine con esempi specifici del perché le cose funzionano e non corrispondono.
- Regular-Expressions.info ha anche una guida killer per molte delle cose più avanzate, oltre a una comoda pagina di riferimento.
- Gnu.org ha una pagina dedicata all'uso delle espressioni regolari con grep.
Puoi anche creare e testare le tue espressioni regolari utilizzando uno strumento online gratuito basato su Flash chiamato RegExr. Funziona mentre digiti, è gratuito e può essere utilizzato nella maggior parte dei browser.
Hai un uso preferito per le espressioni regolari? Conosci un grande renamer di lotti che li usa? Forse vuoi solo vantarti del tuo grep-fu. Contribuisci con i tuoi pensieri commentando!