Regex: Comment puis-je remplacer une partie d'un modèle et la référence à une variable à l'intérieur d'elle?
Je veux correspondre à un modèle, remplacer une partie du modèle, et d'utiliser une variable dans le modèle en tant que partie de la chaîne de remplacement.
Est-ce correct?
/s/^((\s+)private\sfunction\s__construct\(\))/(2)def\s__init__
En anglais: Remplacer toute quantité d'espaces, suivi par la chaîne "private function __construct()"
avec la même quantité de blanc et la chaîne def __init__
. Donc, c'est ma regex mauvais ou quoi?
Quel langage/de l'application utilisez-vous? (Pas la langue de vos données. Celui qui est de l'exécution de l'expression.)
Vi
.OriginalL'auteur Wolfpack'08 | 2012-01-18
Vous devez vous connecter pour publier un commentaire.
Cela s'appelle une référence arrière, et que vous utilisez
\i
de se reporter au i-ième groupe capturé à partir de la configuration.Donc, pour le motif
^((\s+)private\sfunction\s__construct\(\))
, le remplacement est\2def __init__
.:s/^((\s+)$this->).*$/\2self./
. Comme vous pouvez le voir, je suis à la recherche de^(\s+)this->.*$
, droit? Mais je ne veux remplacer cette partie du modèle de recherche:\s+this->
. Donc, j'ai utilisé deux séries de crochets.... Dois-je référence\2
ou\1
?La capture de crochets sont comptés de gauche à droite, de sorte
\1
pour cet exemple. Puisque c'est dans vi, vous avez à s'échapper des bribes de l'expression régulière, voir @PrashantBhate de réponse. Soit ça, soit j'utilise le\v
drapeau dans vim pour l'utilisation normale de la syntaxe regex, mais je ne suis pas sûr si vi a elle.OriginalL'auteur mathematical.coffee
Je suppose que vous voulez remplacer dans
vi
Remplacer toutes les occurrences
Remplacer première
Quelques suggestions pour votre modèle de
/
est utilisé dansvi
pour la recherche , l'utilisation:
(
)
en vi\i
où i est xe du groupe de capture comme\1
\2
de référence arrière groupés en remplacement\s
ne peut pas être utilisé en remplacement de texte utilisation' '
au lieu/g
si vous voulez remplacer toutes les occurrenceshttp://vimregex.com devrait vous aider à obtenir commencé.
{$\n\r replaceme
, je recherche{$\n\r\s+replaceme^
, et je ne veux pour remplacer\s+replaceme
. La raison pour laquelle je veux faire, c'est parce que il ya des moments où "replaceme" n'est pas précédé par{$\n\r
, et je ne veux pas la commande pour activer sur ceux-ci. Donc, puis-je remplacer "replaceme" que lorsqu'il est précédé par{$\n\r
, et de commencer mon remplacement avec la même quantité d'espaces?OriginalL'auteur Prashant Bhate
Je crois que personne n'a vraiment compris la question. Fondamentalement, la façon dont je le fais, c'est comme suit:
"Si vous voulez la recherche d'un nouveau modèle, modèle a, et de la remplacer par une chaîne de remplacement, le modèle que j'ai, que si on commence avec un modèle, modèle b, ensuite, vous devez inclure modèle b dans la chaîne de remplacement, comme ceci: :/(modèle b)(type a)/(b)(i)/g".
C'est un peu long mais ça vaut la lecture.
Dans le passé, je suis sûr que quelqu'un a pensé, "Il peut sauver beaucoup de ressources pour ne pas remplacer
pattern b
avecpattern b
. C'est redondant de le faire." Peut-être que cela se fait automatiquement. Je n'ai pas trouvé une méthode intégrée dans la vi ou tout autre programme pour le faire. Je suis sûr que je pourrais écrire un script pour le faire, cependant.OriginalL'auteur Wolfpack'08