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

Aide sur la fonction replace-match

4 réponses
Avatar
Nicolas Matringe
Bonjour

Si je comprends dans le principe ce que fait la fonction replace-
match, j'ai un peu de mal =E0 comprendre exactement comment elle
consid=E8re les sous-expressions.

J'essaie de simplifier une fonction afin d'=E9viter de lui faire
parcourir un trop grand nombre de fois tout mon fichier (13 fois
actuellement, je voudrais r=E9duire un peu).
Un certain nombre de ces boucles recherchent une expression r=E9guli=E8re
afin de la remplacer, et je m'interroge sur la possibilit=E9 de
rechercher plusieurs expressions s=E9par=E9es par \| et de ne remplacer
que celle qui a =E9t=E9 trouv=E9e.
Exemple :
(while (re-search-forward "\(<expression 1>\)\|\(<expression 2>\)" nil
t)
(replace-match "<remplacement1>" nil nil \1)
(replace-match "<remplacement2>" nil nil \2))

Est-ce que =E7a marche (remplacement de l'expression n par le
remplacement n, ou est-ce que \1 indique la premi=E8re sous-expression
de l'expression qui a =E9t=E9 trouv=E9e ? Et est-ce que le replace-match qui
fait r=E9f=E9rence =E0 l'expression qui n'a pas =E9t=E9 trouv=E9e est corre=
ctement
ignor=E9 ?

Merci d'avance
Nicolas

4 réponses

Avatar
Matthieu Moy
"Nicolas Matringe" writes:

(while (re-search-forward "(<expression 1>)|(<expression 2>)" nil
t)



Il faut doubler tes .

(replace-match "<remplacement1>" nil nil 1)
(replace-match "<remplacement2>" nil nil 2))



1 et 2, pas 1 et 2, et en 5ème position. Les N sont à utiliser dans
<remplacementN>.

Lire et relire C-h f replace-match.

Sinon, le mieux pour savoir si ça marche, c'est encore d'essayer ;-).

--
Matthieu
Avatar
Nicolas Matringe
On 26 mar, 10:05, Matthieu Moy
wrote:
"Nicolas Matringe" writes:
> (while (re-search-forward "(<expression 1>)|(<expression 2>)" nil
> t)

Il faut doubler tes .



Ah oui, c'est vrai. J'ai tapé ça vite fait chez google (bah oui, je
peux pas poster dans les news. Et puis j'utilise pas emacs pour le
mail ou les news :o)


> (replace-match "<remplacement1>" nil nil 1)
> (replace-match "<remplacement2>" nil nil 2))

1 et 2, pas 1 et 2, et en 5ème position. Les N sont à utiliser dans
<remplacementN>.



La doc était pas très claire. Il faut donc 3 "nil"


Lire et relire C-h f replace-match.



J'arrête pas depuis ce matin mais ça suffit pas. Ou alors j'ai pas
encore atteint le nombre de cafés suffisant.
(en fait je lisais ça, qui est légèrement différent
http://www.gnu.org/software/emacs/elisp-manual/html_mono/elisp.html#Match-D ata
)

Sinon, le mieux pour savoir si ça marche, c'est encore d'essayer ;-).



C'est ce que je vais faire aussi.

Nicolas
Avatar
Nicolas Matringe
On 26 mar, 10:19, "Nicolas Matringe" wrote:
On 26 mar, 10:05, Matthieu Moy

> Sinon, le mieux pour savoir si ça marche, c'est encore d'essayer ;-).
C'est ce que je vais faire aussi.



Bon, ça marche pas.
Quelqu'un connait une fonction qui permet d'identifier la sous-
expression qui a été trouvée ?

Nicolas
Avatar
Nicolas Matringe
On 26 mar, 12:23, "Nicolas Matringe" wrote:
On 26 mar, 10:19, "Nicolas Matringe" wrote:

> On 26 mar, 10:05, Matthieu Moy
> > Sinon, le mieux pour savoir si ça marche, c'est encore d'essayer ;- ).
> C'est ce que je vais faire aussi.

Bon, ça marche pas.
Quelqu'un connait une fonction qui permet d'identifier la sous-
expression qui a été trouvée ?



Je cherche et je trouve :o)

(while (re-search-forward "((<sous-exp1>)(<sous-exp2>))
|((<sous-exp3>)(sous-exp4))" nil t)
(if (match-string 1)
(replace-match "2n3")
(replace-match "5n6"))
(beginning-of-line))

Nicolas