GNU/Linux >> Linux Esercitazione >  >> Linux

La definizione di un'espressione regolare?

Di recente ho avuto una discussione amichevole con Ghoti su ciò che costituisce un'espressione regolare nei commenti alla mia risposta a questa domanda. Ho affermato che la seguente è un'espressione regolare:

`[Rr]eading[Tt]est[Dd]ata`

Ghoti non era d'accordo, sostenendo che si tratta invece di un file glob. La pagina globale su Wikipedia afferma che (sottolineatura mia):

I glob non includono la sintassi per la stella di Kleene che consente ripetizioni multiple
della parte precedente dell'espressione; quindi non sono
considerate espressioni regolari, che possono descrivere un insieme più ampio di
lingue regolari su un dato alfabeto finito.

Tuttavia, non vi è alcuna citazione per questa affermazione, indicando che si tratta solo dell'opinione di un particolare editore di Wikipedia.

La specifica The Single UNIX ® , versione 2, afferma che una Basic Regular Expression (BRE) può anche essere un singolo carattere:

Un carattere ordinario è un BRE che corrisponde a se stesso:qualsiasi carattere nel
nel set di caratteri supportato, ad eccezione dei caratteri speciali BRE
elencati in Caratteri speciali BRE .

Quindi, qual è la definizione di un'espressione regolare nel mondo *nix e questa definizione esclude i glob di file?

Risposta accettata:

Come lk- ha detto, il -name opzione di find tratterà l'argomento come un glob, non come un'espressione regolare.

Se una stringa viene interpretata come un glob o un'espressione regolare o solo una stringa semplice dipende da cosa viene utilizzato per eseguire l'interpretazione. È una questione di contesto. La stringa nel tuo esempio, [Rr]eading[Tt]est[Dd]ata può essere valutato in diversi modi, ma quello che è dipende da come lo stai usando. Usalo come un globo, è un globo. Usalo come regex, è un regex. Nel caso della domanda da dove ha avuto origine, l'OP ha descritto la stringa come una regex. Pertanto possiamo presumere che stesse pianificando di interpretarlo come una regex.

Un singolo carattere può anche essere una regex, assolutamente. Può anche essere una stringa e può anche essere un globo. Potrebbe essere interpretato come un byte o un tinyint, se lo desideri. Tutto dipende dal contesto.

Esistono numerose specifiche per le espressioni regolari in varie forme. BRE ed ERE sono ben documentati. PCRE aggiunge molte funzionalità. Molti interpreti regex implementeranno, ad esempio, "tutto di ERE e alcuni di PCRE". Oppure faranno ERE meno alcune funzionalità. Se segui le specifiche formali, molti molti strumenti rivendicano il supporto regex che risulta essere errato o incompleto. Conoscere i dettagli ti consente di adattare le tue soluzioni alla raccolta di funzionalità disponibili all'interno di qualsiasi strumento stia valutando la tua espressione regolare.

Correlati:il comando `ls` non elenca gli ultimi contenuti della directory?

Quindi ... se stai cercando definizioni che "escludano" i glob, stai guardando questo dalla prospettiva sbagliata. Che cos'è è determinato da come lo usi .


Linux
  1. Perché "\d" non funziona nelle espressioni regolari in sed?

  2. Come utilizzare lookahead per escludere caratteri speciali in un'espressione regolare

  3. Qual è la definizione di una sessione in Linux?

  4. Colorazione globale del terminale tramite Regex

  5. Espressione regolare per trovare caratteri doppi in Bash

Iniziare con le espressioni regolari

Espressioni regolari in Grep (Regex)

Perché l'espressione regolare funziona in X ma non in Y?

Hai bisogno di sfuggire ai caratteri Regex in Sed per essere interpretato come caratteri Regex?

10 esempi pratici di regex con grep

Definizione della variabile TEXINPUTS