Qual è la definizione di un'espressione regolare?


10

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 quanto segue è 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 glob su Wikipedia afferma che (enfasi la mia):

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

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

La specifica UNIX ® singola, versione 2 , afferma che un'espressione regolare di base (BRE) può anche essere un singolo carattere:

Un personaggio ordinario è un BRE che si adatta a se stesso: qualsiasi personaggio 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 quella definizione esclude globs di file?


6
Nella CS teorica, un'espressione regolare è una descrizione di un linguaggio regolare, che può essere riconosciuto da un automa finito. Nel mondo Unix, è molto più complicato e non esiste un'unica definizione. Ci sono 2 dialetti regex nel POSIX spec: estese e di base, che vengono utilizzati da strumenti come grep, sede awk. Vim usa la propria varietà, così come Perl.
jw013,

Quindi, secondo quella definizione, un file glob è un BRE giusto?
terdon

2
No, un file glob NON è un BRE - cosa ti fa pensare che lo sia? Se leggi la descrizione POSIX di BRE e la descrizione POSIX di globbing, noterai che non sono gli stessi. Ad esempio, *ha due significati diversi in BRE e globs. Nota: non credo che il termine glob sia usato da nessuna parte nelle specifiche POSIX - si chiama invece Pattern Matching ed è descritto nel capitolo del linguaggio shell.
jw013,

Risposte:


10

Come dicevo, l' -nameopzione di findtratterà l'argomento come un glob, non un'espressione regolare.

Se una stringa viene interpretata come un glob o una regex 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]atapuò essere valutato in un certo numero di modi diversi, ma ciò che è dipende da come lo si utilizza. Usalo come un glob, è un glob. Usalo come regex, è una regex. Nel caso della domanda da cui proviene , l'OP ha descritto la stringa come regex. Quindi possiamo presumere che stesse pianificando di interpretarlo come una regex.

Un singolo personaggio può anche essere una regex, assolutamente. Può anche essere una stringa e può anche essere un glob. Se lo desideri, potrebbe essere interpretato come un byte o un minuscolo. Tutto dipende dal contesto.

Esistono diverse specifiche per le espressioni regolari in varie forme. BRE ed ERE sono ben documentati. PCRE aggiunge un sacco di funzionalità. Molti interpreti regex implementeranno, ad esempio, "tutto ERE e alcuni PCRE". O faranno ERE meno alcune funzionalità. Se si seguono specifiche formali, molti strumenti sostengono 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 qualunque strumento stia valutando la tua regex.

Quindi ... se stai cercando definizioni che "escludano" i globs, lo stai guardando dalla prospettiva sbagliata. Ciò che è determinato da come lo usi .


7

[Rr]eading[Tt]est[Dd]atasembra essere valido sia come glob che come espressione regolare, e credo che abbia lo stesso "significato" in entrambe le interpretazioni. Tuttavia, l' -nameopzione di findtratterà l'argomento come un glob, non un'espressione regolare.

Questa distinzione conta se fornisci un argomento come foo*, che è sia un glob valido che un'espressione regolare valida, ma ha un significato diverso a seconda dell'interpretazione:

Se interpretato come un modello glob, questo corrisponderà foo, foobar, foo123, etc.

Se interpretato come un'espressione regolare, questo corrisponderà fo, foo, foooooo, etc.


Grazie, vedo la differenza tra un pattern glob e un regex. Qual è la definizione formale di regex però?
terdon

1
Non so se esiste una singola definizione per "espressioni regolari" poiché il termine è comunemente usato. Esistono diverse specifiche di sintassi, come le espressioni regolari POSIX o le espressioni regolari Perl, che includono altre "caratteristiche" come backreferenze o lookahead. Queste potrebbero non essere più espressioni regolari nel senso più stretto (nel contesto di linguaggi formali regolari) ma sono comunque definite tali.
lk-
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.