Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Regexp Vim

1 réponse
Avatar
Rémi Moyen
Bonjour,

Je cherche comment =E9crire une regexp sous Vim pour reformater un bout
de code source et je n'arrive pas trop =E0 m'en sortir. J'ai mis un x-
post sur fco.unix parce que je sais que pas mal d'habitu=E9s y trainent,
mais le suivi est sur fca.editeurs-de-texte.

J'ai un fichier de code source en C++, o=F9 les noms de fonction sont du
type Classe::nomDeFonction() et je veux le reformater en
Classe::nom_de_fonction(). Il se trouve que les fonctions de cette
classe ne sont presque pas appel=E9es par la classe elle-m=EAme, donc je
n'ai =E0 me pr=E9occuper (dans ce fichier du moins) que des ent=EAtes de
fonction, pas des appels.

Pour identifier ces lignes, je peux faire une recherche comme =E7a (j'ai
rajout=E9 des espaces pour rendre les choses lisibles, mais je ne les
mets =E9videmment pas en vrai) :
/:: \([a-z]\+\) \( \([A-Z]\) \([a-z]\+\) \) (
Je cherche :: suivi d'un mot en minuscule puis de au moins un mot
commen=E7ant par une majuscule suivi de minuscules, et enfin une
parenth=E8se ouvrante.

Bon, je pourrais utiliser des trucs plus g=E9n=E9riques que [a-z] mais
dans mon cas, j'ai que des lettres dans les noms, donc =E7a marche tr=E8s
bien. De toute fa=E7on, =E7a n'est pas la recherche qui me pose probl=E8me.

Par contre, pour le remplacement, je s=E8che un peu sur l'aspect
groupements imbriqu=E9s. Je ne sais pas comment r=E9cup=E9rer tous les bloc=
s
de \( \([A-Z]\) \([a-z]\+\) \)\+ : \1 contient tout le bloc externe
(le dernier mot), \2 contient la derni=E8re majuscule, \3 les minuscules
du dernier mot, mais comment faire pour avoir les autres mots ?

J'ai bidouill=E9 en plusieurs =E9tapes, en consid=E9rant d'abord que je n'a=
i
qu'un seul mot =E0 remplacer (::parExemple() devenant ::par_exemple()) :
:.s/::\([a-z]\+\)\([A-Z]\)\([a-z]\+\)(/::\1_\l\2\3(/g
Puis en prenant deux mots =E0 remplacer :
:.s/::\([a-z]\+\)\([A-Z]\)\([a-z]\+\)\([A-Z]\)\([a-z]\+\)(/::\1_\l\2\3_
\l\4\5(/g
etc.

Comme dans mon cas je ne vais pas au del=E0 de 3 mots, =E7a n'a pas =E9t=E9
trop compliqu=E9, mais je suis un peu vex=E9 de ne pas avoir trouv=E9
comment faire une expression unique.

Est-ce que quelqu'un =E0 une id=E9e de comment j'aurais pu faire mon
remplacement en une seule fois ?

Merci !
--
R=E9mi Moyen

1 réponse

Avatar
Rémi Moyen
On Oct 11, 11:58 am, Rémi Moyen wrote:

Pour identifier ces lignes, je peux faire une recherche comme ça (j'ai
rajouté des espaces pour rendre les choses lisibles, mais je ne les
mets évidemment pas en vrai) :
/::    ([a-z]+)    (  ([A-Z])    ([a-z]+)  )    (



Évidemment, j'ai réussi à me planter dans mes copier/coller de mon
historique de vi... Il manque un + à la fin (sinon ça ne marche que
si il y a une seule majuscule dans le nom). J'aurais dû mettre :
/::    ([a-z]+)    (  ([A-Z])    ([a-z]+)  )+    (

Ça ne change rien au reste de ma question. Désolé pour l'erreur...
--
Rémi Moyen