Emacs Lisp regexp

Le
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.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Luc.Habert.00__arjf
Le #21779721
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.
Paul Gaborit
Le #21779711
À (at) Tue, 11 Mar 2008 17:44:43 +0100,
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 ?



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 -
Paul Lennon
Le #21779701
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.
Paul Gaborit
Le #21779691
À (at) Tue, 11 Mar 2008 18:09:54 +0100,
Paul Gaborit
À (at) Tue, 11 Mar 2008 17:44:43 +0100,
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 ?



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 -
Paul Gaborit
Le #21779681
À (at) Tue, 11 Mar 2008 22:52:10 +0100,
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.



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

--
Paul Gaborit -
Publicité
Poster une réponse
Anonyme