Vim: Wie schließe ich ein ganzes Wort von meiner Suche aus?

Ziemlich grundlegende Frage, ich versuche, eine Regex in Vim zu schreiben, um mit jeder Phrase beginnend mit "abc" direkt gefolgt von etwas anderem als "defg" zu entsprechen.

Ich habe "[^ defg]" verwendet, um jedes einzelne Zeichen außer d, e, f oder g zu finden.

My first instinct was to try /abc [^\(defg\)] or /abc [^\] but neither one of those works.

0
meinst du vorher? oder gefolgt von? Ihre Beispiele scheinen zu folgen.
hinzugefügt der Autor rampion, Quelle

4 Antworten

vorgegangen oder gefolgt von?

Wenn alles mit 'abc' beginnt und nicht (sofort) von 'defg' gefolgt wird, möchten Sie bmdhacks 'Lösung .

Wenn es etwas gibt, das mit 'abc' beginnt und nicht (sofort) vor 'defg' steht, dann wollen Sie einen negativen Lookbehind:

/\%(defg\)\@

This will match any occurance of 'abc ' as long as it's not part of 'defgabc '. See :help \@ for more details.

Wenn Sie 'abc' abgleichen möchten, solange es nicht zu 'defg. * Abc' gehört, fügen Sie einfach einen . * hinzu:

/\%(defg.*\)\@

Die Übereinstimmung von "abc" nur in Zeilen, in denen "defg" nicht auftritt, ist ähnlich:

/\%(defg.*\)\@

Although, if you're just doing this for a substitution, you can make this easier by combining :v// and :s//

:%v/defg/s/abc //g

This will substitute '' for 'abc ' on all lines that don't contain 'defg'. See :help :v for more.

0
hinzugefügt

Hier gehen wir, das ist ein haariger:

/\%(\%(.\{-}\)\@<=XXXXXX\zs\)*

(Ersetzen Sie XXXXXX durch das Suchwort). Dies wird nach allem suchen, was nicht XXXXXX enthält. Ich stelle mir vor, wenn du es getan hättest:

/abc \%(\%(.\{-}\)\@<=defg\zs\)*

Dies funktioniert möglicherweise so, wie Sie es möchten. Hoffe das hilft ein wenig!

0
hinzugefügt

/ abc \ [^ d] [^ e] [^ f] [^ g]

Es ist ziemlich umständlich für größere Wörter, aber funktioniert wie ein Zauber.

0
hinzugefügt
Passt das nicht auch zu "abc daaa"?
hinzugefügt der Autor Paul Tomblin, Quelle

Hier ist die Suchzeichenfolge.

/abc \(defg\)\@!

Das gesuchte Konzept wird als Negativ-Look-Ahead-Assertion bezeichnet. Versuchen Sie dies in vim für weitere Informationen:

:help \@!
0
hinzugefügt
+1 Ich habe diese Frage schon seit einiger Zeit. Ich würde deinen Kommentar als Spam markieren, wenn ich keine Angst hätte, dass es deinen Repräsentanten verletzen könnte.
hinzugefügt der Autor xdhmoore, Quelle
Für den Rekord bin ich ein Emacs Benutzer :-)
hinzugefügt der Autor bmdhacks, Quelle