2017-11-15 3 views
1

Meine Organisation hat eine hauseigene Sprache, mit Syntax wie:Vim Regex: Erfassung * erste * Instanz des Wortes zwischen den Zeichen

cmo/create/mo1///tri 
createpts/brick/xyz/2,2,2/0.,0.,0./1.,1.,1./1,1,1 

Ich bin eine Vim-Syntax-Datei zu schreiben, und möchte die erfassen erste Instanz eines Wortes durch zwei Zeichen eingeschlossen (in diesem Fall, /), ohne Erfassen der Zeichen selbst.

Ie, würde die regex erfassen, aus den oben genannten Linien,

create 
brick 

Meine Lösung so weit, dieses Muster zu verwenden ist:

[,/=" "].\{-}[,/=" "] 

Aber von /this/and/this/and/this, wird es erfassen /this/and/this/and/this/.

Wie Sie sehen können, ist das Problem zweifach: (i) meine aktuelle Lösung ist gierig und (ii) erfasst die / Zeichen auch, wenn ich nur die Wörter von diesen eingeschlossen haben möchte.

Danke!

+1

Verwenden Sie positive Lookbehind und positive Lookahead. Ich glaube, vim Syntax ist '\ @<=' für positive Lookbehind und '\ @ =' für positive Lookahead – ctwheels

+2

Arbeit mit '\ zs' Übereinstimmung resetter'^(?: \ W +)?/\ Zs \ w + \ (/ \) \ @ = ' – revo

+1

^, und Sie können' [^ /] * 'verwenden, um den Lookahead und' \ w * 'zu vermeiden, um die Gruppe zu vermeiden. – Ryan

Antwort

1

Eine mögliche Lösung:

^[^\/]\+\/\zs[^\/]\+\ze\/ 
  • ^ Anker der Suche auf die BOL,
  • [^\/]\+ eines oder mehr Nicht-Schrägstrich-Zeichen, so viele wie möglich,
  • \/ ein Schrägstrich,
  • \zs Beginnen Sie das Spiel hier,
  • [^\/]\+ ein oder mehrere Nicht-Schrägstrich-Zeichen, so viele wie möglich.
+1

Auch dies stellt nicht sicher, dass Sie das Wort durch Schrägstriche eingeschlossen haben. – revo

+1

Nun ... fügen Sie einfach '\ ze \ /' hinzu. – romainl

Verwandte Themen