64 votes

Backreference Vim regex

Je veux faire ça:

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

Pourquoi shop_(*) correspond à rien?

80voto

Zack Points 44583

[Jokey seulement une réponse quelque peu utile rédigée. La réponse réellement utile de Daenyth, à la majorité des votes positifs.]

78voto

Daenyth Points 11297

Il y a plusieurs questions ici.

  1. des parenthèses dans vim regexen ne sont pas pour la capture -- vous devez utiliser \( \) pour les captures.

  2. * ne veut pas dire ce que vous en pensez. Il signifie "0 ou plus de la précédente", de sorte que votre regex signifie "une chaîne de caractères qui contient shop_ , puis 0+ ( puis un littéral ).
    Vous êtes à la recherche pour ., ce qui en regex signifie "n'importe quel caractère". Mis en place avec une étoile comme .* il signifie "0 ou plus de n'importe quel caractère". Vous voulez probablement au moins un caractère, utilisez donc .\+ (+ signifie "1 ou plus de la précédente")

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

Éventuellement fin il avec g après le dernier slash pour remplacer toutes les occurrences sur une ligne plutôt que de simplement la première.

28voto

Stephen Points 16714

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

Echappez les parenthèses de capture et utilisez .* pour faire correspondre un nombre quelconque de caractères.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X