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

Emacs Lisp regexp

5 réponses
Avatar
Paul Lennon
Bonjour à tous,

Je cherche une regexp pour trouver des patterns du genre
{\sqrt{45}+1} evidemment {[^\}]+} ne fonctionne que s'il n'y a pas de
} dans le groupe.


Une idée ?

merci d'avance.

5 réponses

Avatar
Luc.Habert.00__arjf
Paul Lennon :

Je cherche une regexp pour trouver des patterns du genre
{sqrt{45}+1} evidemment {[^}]+} ne fonctionne que s'il n'y a pas de
} dans le groupe.



Je ne suis pas sûr de bien comprendre la question. Si tu veux une regexp qui
matche des expressions bien parenthésées, c'est impossible. La solution
consiste à se placer dans un mode pour lequel les accolades sont des
délimiteurs, et le un quote, comme le mode TeX, puis se placer sur
l'accolade ouvrante et utiliser forward-sexp (C-M-f) pour se déplacer à
l'accolade fermante.
Avatar
Paul Gaborit
À (at) Tue, 11 Mar 2008 17:44:43 +0100,
Paul Lennon écrivait (wrote):
Bonjour à tous,

Je cherche une regexp pour trouver des patterns du genre
{sqrt{45}+1} evidemment {[^}]+} ne fonctionne que s'il n'y a pas
de } dans le groupe.

Une idée ?



De manière générale, un moteur de regexp ne peut pas gérer les
expressions correctement imbriquées de niveau quelconque. Certains
moteurs de regexp (comme celui de Perl mais je ne pense pas que ce
soit le cas de celui d'emacs) savent le faire. Mais ce sont des
extensions et on ne devrait plus appeler cela des regexp (ce n'est
plus /regular/ ou rationnel).

Maintenant, si on se limite à un nombre de niveaux bien précis on peut
faire un truc comme ci-dessous.

Pour un ou zéro niveau :

{[^{}]+{[^{}]+}[^{}]+}|{[^{}]+}

--------------------/ ------/
niv.1 niv.0

Pour deux, un ou zéro niveau :

{[^{}]+{[^{}]+{[^{}]+}[^{}]+}[^{}]+}|{[^{}]+{[^{}]+}[^{}]+}|{[^{}]+}

----------------------------------/ --------------------/ ------/
niv.2 niv.1 niv.0


Et on peut continuer comme ça mais c'est explicite pour chaque niveau.
C'est lourd mais ça marche... ;-)

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/&gt;
Avatar
Paul Lennon
Paul Lennon a écrit :
Bonjour à tous,

Je cherche une regexp pour trouver des patterns du genre
{sqrt{45}+1} evidemment {[^}]+} ne fonctionne que s'il n'y a pas de
} dans le groupe.


Une idée ?

merci d'avance.





Pour préciser mon idée je voudrais transformer

{{sqrt{2}}over{sqrt{25}}}

en


drac{sqrt{2}}{sqrt{25}}


j'espère avoir été plus clair.
Avatar
Paul Gaborit
À (at) Tue, 11 Mar 2008 18:09:54 +0100,
Paul Gaborit écrivait (wrote):
À (at) Tue, 11 Mar 2008 17:44:43 +0100,
Paul Lennon écrivait (wrote):
Bonjour à tous,

Je cherche une regexp pour trouver des patterns du genre
{sqrt{45}+1} evidemment {[^}]+} ne fonctionne que s'il n'y a pas
de } dans le groupe.

Une idée ?



De manière générale, un moteur de regexp ne peut pas gérer les
expressions correctement imbriquées de niveau quelconque. Certains
moteurs de regexp (comme celui de Perl mais je ne pense pas que ce
soit le cas de celui d'emacs) savent le faire. Mais ce sont des
extensions et on ne devrait plus appeler cela des regexp (ce n'est
plus /regular/ ou rationnel).

Maintenant, si on se limite à un nombre de niveaux bien précis on peut
faire un truc comme ci-dessous.

Pour un ou zéro niveau :

{[^{}]+{[^{}]+}[^{}]+}|{[^{}]+}

--------------------/ ------/
niv.1 niv.0

Pour deux, un ou zéro niveau :

{[^{}]+{[^{}]+{[^{}]+}[^{}]+}[^{}]+}|{[^{}]+{[^{}]+}[^{}]+}|{[^{}]+}

----------------------------------/ --------------------/ ------/
niv.2 niv.1 niv.0


Et on peut continuer comme ça mais c'est explicite pour chaque niveau.
C'est lourd mais ça marche... ;-)



J'ai oublié un détail : lorsqu'il a plusieurs sous-groupes {...}. La
version à un ou zéro niveau devient alors :

{[^{}]+({[^{}]+})+[^{}]+}|{[^{}]+}

-------------------------/ ------/
niv.1 niv.0

Je vous laisse compléter pour le niv.2... ;-)


--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/&gt;
Avatar
Paul Gaborit
À (at) Tue, 11 Mar 2008 22:52:10 +0100,
Paul Lennon écrivait (wrote):
Paul Lennon a écrit :
Bonjour à tous,

Je cherche une regexp pour trouver des patterns du genre
{sqrt{45}+1} evidemment {[^}]+} ne fonctionne que s'il n'y a pas
de } dans le groupe.


Une idée ?

merci d'avance.





Pour préciser mon idée je voudrais transformer

{{sqrt{2}}over{sqrt{25}}}

en


drac{sqrt{2}}{sqrt{25}}


j'espère avoir été plus clair.



Ma deuxième réponse devrait vous permettre de le faire...

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/&gt;