web-dev-qa-db-fra.com

Vre regex backreference

Je veux faire ça:

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

Pourquoi shop_(*) ne correspond-il à rien?

56
nnyby

Si je comprends bien, vous voulez %s/shop_\(.*\)/shop_\1 wp_\1/

Échappez à la parenthèse de capture et utilisez .* pour correspondre à n'importe quel nombre de n'importe quel caractère.

(Votre recherche recherche "shop_" suivi d'un nombre quelconque de parenthèses ouvrantes suivi d'une parenthèse fermante)

17
Stephen

Il y a plusieurs problèmes ici.

  1. les parens dans vim regexen ne sont pas destinés à la capture - vous devez utiliser \( \) pour les captures.

  2. * Ne signifie pas ce que vous pensez. Cela signifie "0 ou plus de la précédente", donc votre expression régulière signifie "une chaîne qui contient shop_ Suivi de 0+ ( Et ensuite d'un littéral ).
    Vous recherchez ., Qui en regex signifie "n'importe quel caractère". Mis avec une étoile comme .* Cela signifie "0 ou plus de n'importe quel caractère". Vous voulez probablement au moins un caractère, utilisez donc .\+ (+ Signifie "1 ou plus du précédent")

Utilisez ceci: %s/shop_\(.\+\)/shop_\1 wp_\1/.

Vous pouvez éventuellement le terminer par g après la barre oblique finale pour remplacer toutes les instances sur une seule ligne plutôt que la première.

67
Daenyth