570 Stimmen

Wie kann ich mein Spiel in vim nicht gierig machen?

Ich habe eine große HTML-Datei mit vielen Auszeichnungselementen, die wie folgt aussehen:

<p class="MsoNormal" style="margin: 0in 0in 0pt;">
  <span style="font-size: small; font-family: Times New Roman;">stuff here</span>
</p>

Ich versuche, eine Vim-Suche und -Ersetzung durchzuführen, um alle class="" y style="" aber es fällt mir schwer, das Spiel ungerecht zu gestalten.

Mein erster Versuch war dieser

%s/style=".*?"//g

aber Vim scheint nicht die ? . Leider ist das Entfernen der ? macht das Spiel zu gierig.

Wie kann ich mein Spiel ungeduldig machen?

0 Stimmen

Ich finde die Antwort von Paul gut. Nur um zu sagen, dass "?" in vim nicht optional bedeutet (wenn es das ist, was Sie mit "?" erreichen wollen)

16 Stimmen

@LB, in vielen Sprachen bedeutet .*?, dass ein beliebiges Zeichen übereinstimmt, aber nicht gierig ist. Das ist es, was er zu erreichen versucht.

0 Stimmen

876voto

Randy Morris Punkte 37931

Anstelle von .* verwenden. .\{-} .

%s/style=".\{-}"//g

Siehe auch :help non-greedy

72voto

Die nicht gierige Suche in vim wird mit dem Operator {-} durchgeführt. Zum Beispiel so:

%s/style=".\{-}"//g

Versuchen Sie es einfach:

:help non-greedy

49voto

Paul Tomblin Punkte 172816

Was ist falsch an

%s/style="[^"]*"//g

20voto

FrDarryl Punkte 191

Wenn Sie mit der PCRE-Regex-Syntax besser vertraut sind, die

  1. unterstützt den Nicht-Greedy-Operator ?, wie Sie in OP gefragt haben; und
  2. keine Rückwärtshacken von Gruppierungs- und Kardinalitätsoperatoren erfordert (eine völlig kontraintuitive Anforderung der Vim-Syntax, da man keine literalen Zeichen abgleicht, sondern Operatoren angibt); und
  3. Sie haben [g]vim mit der Perl-Funktion kompiliert, testen Sie mit

    ver und überprüfen Sie die Funktionen; wenn +perl vorhanden ist, können Sie loslegen)

Versuchen Sie Suchen/Ersetzen mit

:perldo s///

Beispiel. Vertauschen Sie src- und alt-Attribute in einem img-Tag:

<p class="logo"><a href="http://stackoverflow.com/"><img src="/caminoglobal_en/includes/themes/camino/images/header_logo.png" alt=""></a></p>

:perldo s/(src=".*?")\s+(alt=".*?")/$2 $1/

<p class="logo"><a href="http://stackoverflow.com/"><img alt="" src="/caminoglobal_en/includes/themes/camino/images/header_logo.png"></a></p>

14voto

William Pursell Punkte 188248

Ich habe festgestellt, dass eine gute Lösung für diese Art von Fragen lautet:

:%!sed ...

(oder Perl, wenn Sie das bevorzugen). Das heißt, anstatt die Regex-Eigenheiten von Vim zu lernen, benutzen Sie ein Werkzeug, das Sie bereits kennen. Die Verwendung von Perl würde den ? Modifikator arbeiten lassen, um die Übereinstimmung ungreedy.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X