2012-12-14 9 views
8

Utilizzando vim 7.2, per questo testo:vim pattern matching due gettoni senza un'altra proposta gettone trascorre

foo gettone foo countertoken foo gettone foo bersaglio foo countertoken foo

Voglio ma ogni stringa che inizia con 'token' e termina con 'target', che non contiene 'countertoken'.

Così, nell'esempio di cui sopra, voglio corrispondere a questo:

pippo pippo gettone pippo pippo pippo countertoken foo gettone obiettivo foo pippo pippo pippo countertoken

ma non this:

foo foo token o pippo pippo pippo countertoken obiettivo pippo gettone pippo pippo pippo countertoken

(La ragione di questo è che, in pratica, sono la ricerca di file lunghi e sono interessato a l'ultimo 'token' prima della 'bersaglio'. I token sono un po 'come i tag XML, ma non sono XML, quindi gli strumenti XML non sono di aiuto. So che potrei usare \zs così il cursore si posiziona su 'target' e poi cerca indietro 'token', ma sicuramente c'è una soluzione in un solo passaggio!)

Speravo che qualcosa del genere potesse funzionare, ma non funziona t:

/token\(.*countertoken.*\)\@!*target 

ci sono molti di questi avvenimenti che mi interessano, e, naturalmente, i file che sto cercando non sono davvero pieno di nulla come regolare come 'foo'.

Esiste una regex su una riga per questo in vim?

risposta

1

Se si è interessati solo all'ultimo token, non è necessario preoccuparsi di countertoken. Una possibilità è cercare l'ultima occorrenza di token e abbinare tutto fino al prossimo target.

/.*\zs\(token\).\{-}\(target\) 

Spiegazione:

  • .*\zs - corrispondere al verificarsi.
  • \(token\) - Partita stringa "token"
  • .\{-} match non avido
  • \(target\) - Partita stringa "target"
+0

Grazie, ma che non tiene conto del fatto che l'ultima occorrenza può includere ' countertoken'. Mi rendo conto che dovrei chiarire: le stringhe a cui sono interessato si verificano più volte nel file, e ognuna di esse può includere o meno il countertoken: mi interessa quando non lo fanno. Ho modificato la domanda. –