2013-08-19 16 views
10

Recentemente mi sono imbattuto nello specificatore del ramo nei buildin di reex di Vim. sezione di aiuto di Vim su \& contiene questo:Che cos'è il pattern & in Vim's Regex

A branch is one or more concats, separated by "\&". It matches the last 
concat, but only if all the preceding concats also match at the same 
position. Examples: 
     "foobeep\&..." matches "foo" in "foobeep". 
     ".*Peter\&.*Bob" matches in a line containing both "Peter" and "Bob" 

Non è chiaro come vengono utilizzati e che cosa serve per. Una buona spiegazione di ciò che fa e di come viene usata sarebbe grande.

essere chiaro questo è non il & (sostituire con tutta la partita) utilizzato per un cambio, questo è il \& utilizzato in un modello.

Esempio di utilizzo:

/\c\v([^aeiou]&\a){4} 

Utilizzato per la ricerca di 4 consonanti consecutive (Tratto da punte vim).

+0

Se è possibile collegarsi alla pagina wiki o man in cui l'hai letto, sarebbe fantastico? –

+0

@Sniffer ': modello di aiuto'. – mhinz

+0

@mhinz In questo momento sto eseguendo Windows e non ho VIM, ma in ogni caso sembra che tu conosca la risposta, quindi va bene. Grazie. –

risposta

14

Spiegazione:

\& è quello di \|, ciò che l'operatore e è all'operatore o. Pertanto, entrambi i concat devono corrispondere, ma solo l'ultimo sarà evidenziato.

Esempio 1:

(I seguenti test assumere :setlocal hlsearch.)

Immaginate questa stringa:

foo foobar 

Ora, /foo metterà in evidenza foo in entrambe le parole. Ma a volte vuoi semplicemente abbinare lo foo a foobar. Quindi devi usare /foobar\&foo.

Ecco come funziona comunque. È spesso usato? Non l'ho visto più di un paio di volte finora. La maggior parte delle persone probabilmente usa gli atomi a larghezza zero in casi così semplici. Per esempio. lo stesso di questo esempio potrebbe essere effettuato tramite /foo\zebar.

Esempio 2:

/\c\v([^aeiou]&\a){4}.

\c - ignorare caso

\v - "molto magico" (-> non c'è bisogno di sfuggire al & in questo caso)

(){4} - ripetere lo stesso schema 4 volte

[^aeiou] - escludi questi caratteri

\a - carattere alfabetico

Così, questa, piuttosto confusa, espressione regolare sarebbe partita xxxx, XXXX, wXyZ o WxYz ma non AAAA o xxx1.Mettendola in termini semplici: abbina qualsiasi stringa di 4 caratteri alfabetici che non contenga né 'a', 'e', ​​'i', 'o' o 'u'.

+0

Spiegazione molto bella. –

+0

@Sniffer Nota: in tutti i casi concat può essere sostituito con look-ahead positivo a larghezza zero ('a \ & b \ & c' è sempre' \% (a \) \ @ = \% (b \) \ @ = c ', chiedendo perché non l'hai menzionato, hai solo poche parole sugli atomi a larghezza zero). I look-ahead/look-behinds sono più potenti dei concat e ha senso abituarsi ad usarli solo perché quando si impara un nuovo regexp engine è molto più probabile che non supporti né look-ahead né concats o supporti solo look -ha in testa invece di avere qualsiasi supporto per concats. – ZyX

+0

Nota anche che '\ zs' usato come larghezza zero è buggato: prova a cercare'. \ Zso' con 'foo' nel buffer e confronta il risultato con'. \ @<= O'. Non conosco un bug per '\ ze' però. – ZyX