Vim: Wie kann ich nach einem Wort suchen, das nicht durch ein anderes Wort folgt?
Frage
Pretty grundlegende Frage, ich versuche, einen regulären Ausdruck in Vim zu schreiben jede Phrase Übereinstimmen mit "abc "
begann direkt gefolgt von irgendetwas anderes als "defg"
.
Ich habe verwendet "[^defg]"
für ein einzelnes Zeichen als d anderen übereinstimmen, e, f oder g.
Mein erster Instinkt war, zu versuchen /abc [^\(defg\)]
oder /abc [^\<defg\>]
aber weder eines dieser Werke.
Lösung
Hier ist der Suchbegriff.
/abc \(defg\)\@!
Das Konzept für Sie suchen eine negative Vorgriff Behauptung genannt. Versuchen Sie, diese in vim für weitere Informationen:
:help \@!
Andere Tipps
oder vorangestellt, gefolgt von?
Wenn es etwas mit ‚abc‘ beginnen, die nicht (sofort) ist gefolgt von ‚defg‘, die Sie wollen? bmdhacks' Lösung .
Wenn es etwas gibt, beginnend mit ‚abc‘, die nicht (sofort) mit vorangestelltem ‚defg‘, Sie eine negative Lookbehind wollen:
/\%(defg\)\@<!abc /
Dies wird jede Auftreten von ‚abc‘ entsprechen, solange sie nicht Teil von ‚DEFGABC‘ ist. Siehe :help \@<!
für weitere Details.
Wenn Sie wollen, so lange ‚abc‘ passen, wie es ist nicht Teil von ‚defg * abc.‘, Dann fügen Sie einfach einen .*
:
/\%(defg.*\)\@<!abc /
Matching 'abc' nur auf Strecken, auf denen 'defg' tritt nicht ähnelt:
/\%(defg.*\)\@<!abc \%(.*defg\)\@!/
Obwohl, wenn Sie gerade dies für eine Substitution tun, können Sie dies einfacher machen, indem :v//
und :s//
Kombination
:%v/defg/s/abc /<whatever>/g
Dies wird ersetzen ‚:help :v
für mehr.
Hier gehen wir, das ist eine haarige ein:
/\%(\%(.\{-}\)\@<=XXXXXX\zs\)*
(ersetzen XXXXXX mit dem Suchwort). Dies wird für alles suchen, die nicht nicht XXXXXX enthalten. Ich stelle mir vor, wenn Sie getan haben:
/abc \%(\%(.\{-}\)\@<=defg\zs\)*
Das kann funktionieren, wie Sie es wollen. Hoffe, das hilft ein wenig!
/ abc \ [^ d] [^ e] [^ f] [^ g]
Es ist ziemlich für größere Worte umständlich, sondern wirkt wie ein Zauber.