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

Besoin d'aide sur une expression régulière

15 réponses
Avatar
nic_o_mat
Rebonjour
Puisque j'ai mis les doigts dans l'Elisp je me suis fait happer ...
J'=E9cris une fonction qui remplace des expressions r=E9guli=E8res dans mon
code VHDL mais ne doit pas toucher aux commentaires.
Par exemple, je ne veux qu'une instruction par ligne. Je recherche
donc tout ; (qui marque la fin d'une instruction) qui soit suivi par
un caract=E8re alphab=E9tique \w. Le probl=E8me c'est que =E7a ne fait pas =
la
distinction entre le code et les commentaires. Il faut donc que
j'ajoute dans l'expression que le ; ne doit pas =EAtre pr=E9c=E9d=E9
(n'importe o=F9 dans la ligne) par -- (c'est ainsi qu'on d=E9signe les
commentaires en VHDL)
Comment fait-on pour =E9crire "not --".*; ?

Merci d'avance
Nicolas

5 réponses

1 2
Avatar
nic_o_mat
On 22 mar, 11:04, Matthieu Moy
wrote:

Essayes avec ceci

"^(-?[^-n])*-?;"
(effectivement, c'était [^-n] pour interdire les sauts de ligne)



Ah ben oui, évidemment ...


[1] comment, ne me dis pas que tu n'utilises pas Gnus ?!?



Ben ... non. J'utilise Thunderbird sous Windows (et en plus je peux
pas poster dans les news depuis le boulot, donc Google)

Nicolas
Avatar
nic_o_mat
On 22 mar, 11:49, "" wrote:
On 22 mar, 11:04, Matthieu Moy
wrote:

> Essayes avec ceci

> "^(-?[^-n])*-?;"
> (effectivement, c'était [^-n] pour interdire les sauts de ligne)

Ah ben oui, évidemment ...



Finalement, à l'usage, c'est foireux. Ca détecte très mal le cas de
plusieurs ";" (non consécutifs) sur une même ligne et pire, ça ne
remplace que le premier.

Il faut donc que j'écrive ma fonction différemment : rechercher
l'expression régulière, la remplacer, déplacer le pointeur et
recommencer jusqu'à la fin du fichier, au lieu d'un replace-regexp
bête et méchant.
Ca doit faire un truc du style:
(re-search-forward "mon-expression" nil t)
(replace-match "expression-de-remplacement" nil nil)
le tout dans une boucle (while ... ) que je ne sais pas trop comment
écrire.

Nicolas
Avatar
Matthieu Moy
"" writes:

On 22 mar, 11:49, "" wrote:
On 22 mar, 11:04, Matthieu Moy
wrote:

> Essayes avec ceci

> "^(-?[^-n])*-?;"
> (effectivement, c'était [^-n] pour interdire les sauts de ligne)

Ah ben oui, évidemment ...



Finalement, à l'usage, c'est foireux. Ca détecte très mal le cas de
plusieurs ";" (non consécutifs) sur une même ligne et pire, ça ne
remplace que le premier.



Déjà, il va falloir [^-n;] pour ne pas matcher les ; sauf à la fin de
l'expression. Ensuite, j'avais mis un ^ pour dire « début de ligne »,
mais il n'est pas forcément pertinent.

--
Matthieu
Avatar
nic_o_mat
On 22 mar, 17:18, Matthieu Moy
wrote:
"" writes:
> Finalement, à l'usage, c'est foireux. Ca détecte très mal le cas de
> plusieurs ";" (non consécutifs) sur une même ligne et pire, ça ne
> remplace que le premier.

Déjà, il va falloir [^-n;] pour ne pas matcher les ; sauf à la fin de
l'expression. Ensuite, j'avais mis un ^ pour dire « début de ligne »,
mais il n'est pas forcément pertinent.



Mon problème c'est que je veux "couper" la ligne après un ;
Je veux donc insérer un n après le ; s'il est suivi d'un caractère
alphabétique w (une expression VHDL commence toujours par un
caractère alphabétique)
Et je veux faire ça pour tous les ; *w (hors commentaires,
évidemment)
Je vais y réfléchir ...

Nicolas
Avatar
nic_o_mat
On 22 mar, 17:40, "" wrote:

Mon problème c'est que je veux "couper" la ligne après un ;
Je veux donc insérer un n après le ; s'il est suivi d'un caractère
alphabétique w (une expression VHDL commence toujours par un
caractère alphabétique)
Et je veux faire ça pour tous les ; *w (hors commentaires,
évidemment)
Je vais y réfléchir ...



J'ai écrit ça, ça a l'air de marcher :

(while (re-search-forward "(^(-?[^-n])*?(;|then)) *
(w)" nil t)
(replace-match "1n4")
(beginning-of-line))

Nicolas
1 2