2010-07-26 8 views
47

Ich möchte, dies zu tun:Vim regex Rückreferenzierung

%s/shop_(*)/shop_\1 wp_\1/ 

Warum funktioniert shop_(*) etwas Spiel?

+0

Ich bin ein wenig näher: '% s/shop _/& wp_ \ 1' – nnyby

+1

Wenn ich nicht richtig verstanden habe, versuche Beispiele hinzuzufügen. – Stephen

+5

Diese Frage wäre für zukünftige SO-Benutzer hilfreicher, wenn ein Beispiel für das hinzugefügt wird, was mit der Regex versucht wird. – LondonRob

Antwort

7

Wenn ich richtig verstehe, wollen Sie %s/shop_\(.*\)/shop_\1 wp_\1/

die Erfassung Klammer Flucht- und verwenden .* eine beliebige Anzahl von beliebigen Zeichen übereinstimmen.

(Ihre Suche nach einer beliebigen Anzahl für „shop_“ gefolgt sucht der von einer schließenden Klammer gefolgt Klammern zu öffnen)

56

Es gibt einige Probleme hier.

  1. Pars in vim regexen sind nicht für die Erfassung - Sie \(\) für Aufnahmen verwenden müssen.

  2. * bedeutet nicht, was Sie denken. Es bedeutet "0 oder mehr der vorherigen", also Ihre Regex bedeutet "eine Zeichenfolge, die shop_, gefolgt von 0 + ( und dann ein Literal ) enthält. Sie suchen nach ., die in Regex bedeutet" jedes Zeichen " zusammen mit einem Stern als .* bedeutet es „0 oder mehr von einem beliebigen Zeichen“ Sie wollen wahrscheinlich mindestens ein Zeichen, so .\+ (+ bedeutet „1 oder mehr der vorherigen“) dieser

Gebrauch verwenden.: %s/shop_\(.\+\)/shop_\1 wp_\1/.

Optional beenden Sie es mit g nach dem letzten Schrägstrich Ersetzen Sie für alle Instanzen in einer Zeile statt nur die erste Zeile.

+0

Nur ein nit: die vorhandene Regex hat nicht nach einem Literal '*)', nur ein Literal ')' gesucht. – Stephen

+0

@Stephen: Woops, du hast Recht. Vertippt dort. – Daenyth