9
votes

Regex: Comment puis-je remplacer une partie d'un motif et référencer une variable à cet égard?

Je veux faire correspondre un motif, remplacer une partie du motif et utiliser une variable dans le motif dans le cadre de la chaîne de remplacement.

est-ce correct?

/ s / ^ ((\ s +) privé \ sfunction \ s__construct \ (\)) / (2) def \ s__init __

English: remplacez toute quantité de blanchâtre suivie de la chaîne "Fonction privée __Construction ()" avec la même quantité de blancheur et la chaîne def __init __ . Alors, mon regex est mauvais ou quoi?

remplacement partiel


1 commentaires

Dans quelle langue / application utilisez-vous cela? (Pas la langue que vos données sont dans. Celui qui exécute l'expression.)


3 Réponses :


6
votes

Ceci est appelé une brouillon, et vous utilisez \ i pour vous reporter au groupe capturé de la même manière du motif.

donc pour le modèle ^ ((\ s +) privé \ sfunction \ s__construct \ (\)) , le remplacement est \ 2def __init __ . .


2 commentaires

D'accord, mais voici un autre exemple: : s / ^ ((\ s +) $ ceci ->). * $ / \ 26elf ./< / code>. Comme vous pouvez le constater, je cherche ^ (\ s +) ceci ->. * $ , non? Mais je veux seulement remplacer cette partie du modèle de recherche: \ s + ceci -> . Donc, j'ai utilisé deux ensembles de crochets .... dois-je référer \ 2 ou \ 1 ?


Les crochets de capture sont comptés à gauche à droite, donc \ 1 pour cet exemple. Comme cela se trouve dans VI, vous devez échapper aux bits de l'expression régulière, voir la réponse de @ Prashantbhate. Soit cela ou j'utilise le drapeau \ v dans VIM pour utiliser la syntaxe de regex normale, mais je ne sais pas si VI l'a.



14
votes

Je présume que vous voulez le remplacer dans vi

remplacer toutes les occurrences xxx

remplacez premier xxx

Peu de suggestions à votre modèle

  • / est utilisé dans VI pour la recherche, utilisez :
  • Vous devez échapper au ( ) dans VI
  • Utilisez \ i où je is Xth Capture Group comme \ 1 \ 2 Pour retour Référence Modèles groupés dans le remplacement
  • \ s ne peut pas être utilisé dans le texte de remplacement Utilisation '' au lieu de
  • Utilisez la trailing / g si vous souhaitez remplacer toutes les occurrences

    http://vimregex.com devrait vous aider à démarrer.


2 commentaires

Mais voici un problème .... si j'ai {$ \ n \ r remplactemps , je souhaite rechercher {$ \ n \ r \ s + remplacer ^ , et je veux seulement remplacer \ s + remplactemps . La raison pour laquelle je veux faire est parce qu'il y a des moments où "Remplacement" n'est pas précédé de {$ \ n \ r , et je ne veux pas que la commande soit activée sur ceux-ci. Alors, puis-je remplacer "Remplacement" uniquement lorsqu'il est précédé de {$ \ n \ r et commencez mon remplacement avec la même quantité de blancheur?


Merci beaucoup pour le lien avec vimregex.com . Quelle bonne page! :)



3
votes

Je ne pense pas que quiconque comprenne vraiment la question. Fondamentalement, la façon dont je fais cela est la suivante:

"Si vous souhaitez rechercher un motif de remplacement, un motif A et le remplacer par une chaîne de remplacement, un motif I, uniquement s'il commence par un motif, un motif B, alors vous devez inclure le motif B dans la chaîne de remplacement , comme ceci: / (modèle B) (modèle A) / (motif b) (i) / g ".

C'est un peu verbeux mais qui mérite d'être lu.

Dans le passé, je suis sûr que quelqu'un a pensé, "il pourrait économiser beaucoup de ressources pour ne pas remplacer réellement modèle B avec motif B . C'est redondant faire cela." Peut-être que cela arrive automatiquement. Je n'ai pas trouvé de méthode intégrée à VI ou à tout autre programme pour le faire. Je suis sûr que je pouvais écrire un script pour le faire, cependant.


0 commentaires