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

[Auctex] sos regexp

11 réponses
Avatar
JJ. Rétorré
Je n'arrive pas à composer une regexp de remplacement dans
query-replace-regexp pour remplacer la chaîne "<texte>" par
\og{}<texte>\fg{} quand <texte> contient des retours à la ligne.

Tout aussi bien, j'aimerais remplacer *<texte>* par \emph{<texte>} et
bien évidemment je n'y arrive pas non plus.

Si quelqu'un peut m'aider...

--
JJR

10 réponses

1 2
Avatar
TeXnicien de surface
Le 08/11/2011 12:21, JJ. Rétorré a écrit :

Je n'arrive pas à composer une regexp de remplacement dans
query-replace-regexp pour remplacer la chaîne "<texte>" par
og{}<texte>fg{} quand <texte> contient des retours à la ligne.

Tout aussi bien, j'aimerais remplacer *<texte>* par emph{<texte>} et
bien évidemment je n'y arrive pas non plus.

Si quelqu'un peut m'aider...



Avec ça ? :
"([^"]+)"
remplacer par
og 1fg

et
*([^*]+)*
remplacer par
emph{1}

au passage je ne mets pas de {} car je charge systématiquement xspace
mais si tu les veux...

jeqça

--
Le TeXnicien de surface
Avatar
JJ. Rétorré
TeXnicien de surface disait le 11/08/11 que :

Le 08/11/2011 12:21, JJ. Rétorré a écrit :

Je n'arrive pas à composer une regexp de remplacement dans
query-replace-regexp pour remplacer la chaîne "<texte>" par
og{}<texte>fg{} quand <texte> contient des retours à la ligne.

Tout aussi bien, j'aimerais remplacer *<texte>* par emph{<texte>} et
bien évidemment je n'y arrive pas non plus.

Si quelqu'un peut m'aider...



Avec ça ? :
"([^"]+)"
remplacer par
og 1fg



Super ça marche. Le truc, c'est que j'aimerais bien comprendre pourquoi
ça marche. J'ai parcouru info Emacs, sans doute d'une oreille distraite
:-) la chaîne de remplacement 1 m'était passé à côté, ça manque un peu
d'exemple, et l'anglais, ce n'est pas vraiment ma langue naturelle...
Quel est le rôle des ( .. ), et ou puis-je trouver ça dans info Emacs
? Y a-t-il mieux comme doc ?


et
*([^*]+)*
remplacer par
emph{1}

au passage je ne mets pas de {} car je charge systématiquement xspace
mais si tu les veux...




Pareil, le rôle des parenthèses m'a échappé.

Grand merci, me voilà boosté pour de nouvelles aventures.

--
JJR.
Avatar
JJ. Rétorré
JJ. Rétorré <jj.r&torr&@gmail.com> disait le 11/08/11 que :

TeXnicien de surface disait le 11/08/11 que :



[SNIP]


Pendant que tiens un spécialiste, j'ai aussi besoin de remplacer toutes
(ou presque toutes) les espaces suivant un nombre par une espace
insécable. Pour l'instant je fais en deux temps par
query-replace-regexp : substituer '1~' à '[0-9]+ ' Puis comme il reste
l'espace, je la supprime par un query-replace. Y a-t-il moyen de faire
ça en une fois? sinon, il faut écrire une fonction en elisp ?

--
JJR.
Avatar
TeXnicien de surface
Le 08/11/2011 15:25, JJ. Rétorré a écrit :
TeXnicien de surface disait le 11/08/11 que :

Le 08/11/2011 12:21, JJ. Rétorré a écrit :

Je n'arrive pas à composer une regexp de remplacement dans
query-replace-regexp pour remplacer la chaîne "<texte>" par
og{}<texte>fg{} quand <texte> contient des retours à la ligne.

Tout aussi bien, j'aimerais remplacer *<texte>* par emph{<texte>} et
bien évidemment je n'y arrive pas non plus.

Si quelqu'un peut m'aider...



Avec ça ? :
"([^"]+)"
remplacer par
og 1fg



Super ça marche. Le truc, c'est que j'aimerais bien comprendre pourquoi
ça marche. J'ai parcouru info Emacs, sans doute d'une oreille distraite
:-) la chaîne de remplacement 1 m'était passé à côté, ça manque un peu
d'exemple, et l'anglais, ce n'est pas vraiment ma langue naturelle...
Quel est le rôle des ( .. ), et ou puis-je trouver ça dans info Emacs
? Y a-t-il mieux comme doc ?



Ma science toute relative des regexp me vient du bouquin /Maitrise des
expressions régulières/ paru chez O'Reilly. La 2e édition a été traduite
en français (2003) mais elle est donnée comme indisponible sur amazon.
Ça doit trainer dans des bibliothèques universitaires. La 3e éd.
anglaise est plus à jour mais je ne crois pas qu'elle ait été traduite
en français.

Pour emacs j'ai parcouru les manuels en ligne mais ce n'est pas très
sexy et, en effet, ça manque un peu d'exemples. :-/

Je vais tenter une explication en espérant être assez clair :

Avec [^"] je récupère un caractère qui n'est pas un " et donc aussi les
sauts de ligne (ce que ne fait pas le point . qui correspond à tout
caractère sauf le saut de ligne). [^"]+ correspond donc à une chaine
d'au moins 1 caractère qui n'est pas ". Avec ( et ) je capture la
chaine, ce qui me permet de m'en reservir ensuite avec 1. Si j'ai deux
captures comme ([1-9])([a-z]+), je peux utiliser 1 et 2, etc.

Donc finalement, "([^"]+)" recherche une chaine de caractères y
compris un saut de ligne compris entre " et " et la capture pour usage
futur éventuel.

et
*([^*]+)*
remplacer par
emph{1}

au passage je ne mets pas de {} car je charge systématiquement xspace
mais si tu les veux...




Pareil, le rôle des parenthèses m'a échappé.



Réponse très sommaire :
Les macros og et fg ne prenant pas d'argument, comme toute macro sans
argument, mangent les blancs qui sont derrière.
(Essayer «TeX et» pour voir). La présence des accolades {} va
empêcher TeX de manger les blancs qui suivent. En fait, comme og place
un espace insécable derrière le guillemet ouvrant, il faudra coder
"og{}truc machin " car og{} truc machin donnera
guillemet ouvrant espace insécable espace normal truc
donc trop de blanc entre le guillemet et truc et risque de retrouver le
texte à la ligne avec le malheureux « tout seul au bout.

Pour fg il faudra "fg{} suite" pour éviter "»suite" sauf que, si
xspace est chargé, "fg suite" marche tout aussi bien.

Finalement, c'est bien mieux sans {} et avec xspace. :)


Grand merci, me voilà boosté pour de nouvelles aventures.



De rien. Bonne route.

--
Le TeXnicien de surface
Avatar
TeXnicien de surface
Le 08/11/2011 15:43, JJ. Rétorré a écrit :
JJ. Rétorré <jj.r&torr&@gmail.com> disait le 11/08/11 que :

TeXnicien de surface disait le 11/08/11 que :



[SNIP]


Pendant que tiens un spécialiste,



Oula ! comme il y va, lui ! Un spécialiste ! (J'ai les chevilles qui
enflent tellement que j'ai dû quitter mes bottes pour des charentaises.)

j'ai aussi besoin de remplacer toutes
(ou presque toutes) les espaces suivant un nombre par une espace
insécable. Pour l'instant je fais en deux temps par
query-replace-regexp : substituer '1~' à '[0-9]+ ' Puis comme il reste
l'espace, je la supprime par un query-replace. Y a-t-il moyen de faire
ça en une fois? sinon, il faut écrire une fonction en elisp ?



S'il y a bien un espace derrière [0-9]+ ça doit en manger un.
Donc "17 truc" doit devenir "17~truc". Si tu veux remplacer plus d'un
espace, ce que je fais c'est (mais il y a peut-être moyen d'alléger la
notation) "[0-9]+[ ]+" et je remplace par 1~

jeqça

--
Le TeXnicien de surface
Avatar
Lucas Levrel
Le 8 novembre 2011, TeXnicien de surface a écrit :

Si tu veux remplacer plus d'un
espace, ce que je fais c'est (mais il y a peut-être moyen d'alléger la
notation) "[0-9]+[ ]+" et je remplace par 1~



Est-ce que
[0-9]+ +
ne suffit pas ?

Par ailleurs, pas besoin de () ici pour récupérer le [0-9]+ dans 1 ?

--
LL
Avatar
JJ. Rétorré
TeXnicien de surface disait le 11/08/11 que :

Le 08/11/2011 15:25, JJ. Rétorré a écrit :
TeXnicien de surface disait le 11/08/11 que :





[SNIP]

Ma science toute relative des regexp me vient du bouquin /Maitrise des
expressions régulières/ paru chez O'Reilly. La 2e édition a été traduite
en français (2003) mais elle est donnée comme indisponible sur amazon.
Ça doit trainer dans des bibliothèques universitaires. La 3e éd.
anglaise est plus à jour mais je ne crois pas qu'elle ait été traduite
en français.



C'est quand même un gros investissement, pour un usage assez
occasionnel. On le trouve en version (payante) électronique.

Pour emacs j'ai parcouru les manuels en ligne mais ce n'est pas très
sexy et, en effet, ça manque un peu d'exemples. :-/



Encore qu'il y a pire sur d'autres sujets, mais les exemples, ce n'est
pas le fort de la documentation Emacs.

Je vais tenter une explication en espérant être assez clair :

Avec [^"] je récupère un caractère qui n'est pas un " et donc aussi les
sauts de ligne (ce que ne fait pas le point . qui correspond à tout
caractère sauf le saut de ligne). [^"]+ correspond donc à une chaine
d'au moins 1 caractère qui n'est pas ". Avec ( et ) je capture la
chaine, ce qui me permet de m'en reservir ensuite avec 1. Si j'ai deux
captures comme ([1-9])([a-z]+), je peux utiliser 1 et 2, etc.

Donc finalement, "([^"]+)" recherche une chaine de caractères y
compris un saut de ligne compris entre " et " et la capture pour usage
futur éventuel.




Je pense avoir compris, et j'espère que ça servira à d'autres.
Grand merci.

--
JJR.
Avatar
TeXnicien de surface
Le 09/11/2011 11:08, Lucas Levrel a écrit :
Le 8 novembre 2011, TeXnicien de surface a écrit :

Si tu veux remplacer plus d'un
espace, ce que je fais c'est (mais il y a peut-être moyen d'alléger la
notation) "[0-9]+[ ]+" et je remplace par 1~



Est-ce que
[0-9]+ +
ne suffit pas ?



Je pense que si mais je vois mieux `[ ]'+ que ` +' :)

Par ailleurs, pas besoin de () ici pour récupérer le [0-9]+ dans 1 ?



Si, si. Il faut.


--
Le TeXnicien de surface
Avatar
JJ. Rétorré
TeXnicien de surface disait le 11/09/11 que :

Le 09/11/2011 11:08, Lucas Levrel a écrit :
Le 8 novembre 2011, TeXnicien de surface a écrit :

Si tu veux remplacer plus d'un
espace, ce que je fais c'est (mais il y a peut-être moyen d'alléger la
notation) "[0-9]+[ ]+" et je remplace par 1~



Est-ce que
[0-9]+ +
ne suffit pas ?



Je pense que si mais je vois mieux `[ ]'+ que ` +' :)

Par ailleurs, pas besoin de () ici pour récupérer le [0-9]+ dans 1 ?



Si, si. Il faut.



Le souci, c'est si le nombre est séparé du mot suivant par un retour à
la ligne. Avec cette regexp il ne sera par avalé.

--
JJR.
Avatar
TeXnicien de surface
Le 09/11/2011 22:34, JJ. Rétorré a écrit :
TeXnicien de surface disait le 11/09/11 que :

Le 09/11/2011 11:08, Lucas Levrel a écrit :
Le 8 novembre 2011, TeXnicien de surface a écrit :

Si tu veux remplacer plus d'un
espace, ce que je fais c'est (mais il y a peut-être moyen d'alléger la
notation) "[0-9]+[ ]+" et je remplace par 1~



Est-ce que
[0-9]+ +
ne suffit pas ?



Je pense que si mais je vois mieux `[ ]'+ que ` +' :)

Par ailleurs, pas besoin de () ici pour récupérer le [0-9]+ dans 1 ?



Si, si. Il faut.



Le souci, c'est si le nombre est séparé du mot suivant par un retour à
la ligne. Avec cette regexp il ne sera par avalé.



Alors entre les crochets, placer un espace puis avec Ctrl+Q Ctrl+J un
saut de ligne (on peut même faire un Ctrl+Q TAB pour une tabulation) et
ça devrait faire ce que l'on veut. Je viens de tester :)

jeqça
--
Le TeXnicien de surface
1 2