Le magie regex di Vim sono compatibili con le famose classi regex?


16

Le sintassi delle espressioni regolari di molti strumenti Unix sono spesso le espressioni regolari di base ed estese codificate da POSIX (BRE ed ERE, rispettivamente) e, in alcune implementazioni moderne, lo stile Perl (PCRE è un'implementazione di questo).

Esiste una corrispondenza uno a uno tra i livelli di magia di Vim e tali classi definite esternamente, ma ben note? Sembra \mBRE ed \vERE, tranne POSIX che non include lookaround.

Se esiste una tale corrispondenza, è definita da qualche parte? pattern.txtha solo una menzione di POSIX.

O dobbiamo attenerci alla "magia" per descrivere le espressioni regolari di Vim?


3
Abbastanza sicuro \vinclude i <>confini delle parole, che AFAIK è unico per Vim. Quindi no, descrivili semplicemente come "Vim regex". (Non invio come risposta perché non sono positivo)
Doorknob,

@Doorknob, penso che potresti trovare interessante questa discussione di risposte come commenti . Poiché il tuo commento ha tre voti positivi e nessun commento risponde per dirti che non è corretto, probabilmente è corretto (non ne sono sicuro), ma ha suggerito modifiche et. al. sono impossibili da migliorare la sua precisione. Come risposta pubblicata, potrebbe essere modificata per una maggiore precisione, votata, votata, votata, ecc.
Wildcard

Risposte:


22

In sintesi, no. Il regex di Vim ha un sapore unico e non ci sono opzioni per farlo comportare più come un altro sapore.

Penso che questa sia una buona cosa.

Magia

L' 'magic'opzione non cambia il sapore di regex che Vim usa. \Inverte semplicemente il comportamento di molti atomi sfuggiti.

Ad esempio, per impostazione predefinita, +è un +carattere letterale , dove \+significa "uno o più dell'atomo precedente". Al contrario, *significa "zero o più dell'atomo precedente", mentre \*è letterale *. Molte persone lo trovano abbastanza confuso. L'uso \vnel modello lo rende un po 'più coerente. :help 'magic'dà un buon riassunto:

after:    \v       \m       \M       \V         matches ~
                'magic' 'nomagic'
          $        $        $        \$         matches end-of-line
          .        .        \.       \.         matches any character
          *        *        \*       \*         any number of the previous atom
          ()       \(\)     \(\)     \(\)       grouping into an atom
          |        \|       \|       \|         separating alternatives
          \a       \a       \a       \a         alphabetic character
          \\       \\       \\       \\         literal backslash
          \.       \.       .        .          literal dot
          \{       {        {        {          literal '{'
          a        a        a        a          literal 'a'

Personalmente, penso che il comportamento predefinito sia utile per i file di codice, dove non è raro cercare cose come foo(, usando il letterale (.

Il sapore regex di Vim

Ho visto molte persone desiderare che Vim supportasse PCRE. Personalmente, vorrei che altri strumenti supportassero il sapore di regex di Vim. Ha alcune funzionalità che sono impossibili o troppo ingombranti da raggiungere in PCRE.

Impossibile in PCRE

Lookaround è una funzione comune in cui è possibile affermare che un modello corrisponde o non corrisponde prima o dopo il modello che si sta tentando di abbinare. Ad esempio, il modello PCRE q(?!u)(o modello regex di Vim qu\@!) corrisponde a un qnon seguito da a u. (Questo è più corretto di q[^u], il che richiede che ci sia un po 'di carattere dopo il q.)

Lookbehind negativo a lunghezza variabile

PCRE, e molti altri gusti, hanno una restrizione che un modello di lookbehind negativo deve avere una lunghezza fissa. Ciò significa che un modello simile (?<![a-z]{3})foo, che significa "la stringa foo non preceduta da esattamente 3 lettere minuscole") va bene, ma (?<![a-z]+)foo(che significa "la stringa foonon preceduta da un numero qualsiasi di lettere minuscole") non lo è.

Questa restrizione non esiste in Vim. In Vim, uno schema come \([a-z]\+\)\@<!foo, sebbene forse un po 'brutto da guardare, è perfettamente valido.

Più facile in Vim regex

Alcune cose sono molto più belle nel sapore regex di Vim.

Inizio e fine delle ancore della partita

La più importante, a mio parere, sono la \zse \zeancore. Questi ti consentono di specificare l'inizio e la fine della partita. Ad esempio, foo(\zs.*\ze)corrisponde solo a ciò che è compreso tra (e )in una chiamata di funzione come foo(...). Questo può essere fatto in PCRE, ma richiede l'uso di lookaround, che è leggermente noioso:(?<=foo\().*(?=\))

Abbinamento prefisso

Un'altra cosa interessante che Vim può fare è abbinare qualsiasi prefisso (incluso il prefisso vuoto) di una particolare sequenza di caratteri. Ad esempio, per abbinare su f, fo, foo, o food, il modello f\%[ood]può essere utilizzato. In PCRE, un tale schema sarebbe simile f(o(od?)?)?. (Immagina che per una corda più lunga!)

Posizioni di cursore, linea e colonna corrispondenti

Il regex di Vim ha alcune ancore per abbinare le posizioni nel buffer.


Penso che valga la pena abbracciare il sapore regex di Vim. È adatto per l'uso in un editor di testo utilizzato principalmente per la programmazione ed è abbastanza potente.

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.