56 votes

Emacs : remplacement des expressions régulières pour changer la casse

De temps en temps, je veux remplacer toutes les instances des valeurs comme :

<BarFoo>

avec

<barfoo>

c'est-à-dire remplacer par une expression régulière tout ce qui se trouve entre crochets par son équivalent en minuscules.

Quelqu'un a t-il un petit bout de Lisp qui fait ça ? On peut supposer qu'il s'agit uniquement de valeurs ASCII. Des points bonus pour tout ce qui est assez générique pour prendre une expression régulière complète, et qui ne se contente pas de gérer l'exemple des crochets. Encore plus de points bonus pour une réponse qui utilise simplement M-x query-replace-regexp .

Merci,

Dom

90voto

Luke Girvin Points 8270

Essayez M-x query-replace-regexp con "<\([^>]+\)>" comme chaîne de recherche et "<\,(downcase \1)>" pour le remplacer.

Cela devrait fonctionner pour Emacs 22 et plus, voir ceci Article du blog de Steve Yegge pour plus de détails sur la façon dont les expressions Lisp peuvent être utilisées dans la chaîne de remplacement.

Pour les versions antérieures d'Emacs, vous pouvez essayer quelque chose comme ceci :

(defun tags-to-lower-case ()
  (interactive)
  (save-excursion
    (goto-char (point-min))
    (while (re-search-forward "<[^>]+>" nil t)
      (replace-match (downcase (match-string 0)) t))))

9 votes

C'est cool ! Je n'étais pas au courant de l'existence de \,() dans les expressions régulières Emacs.

1 votes

J'obtiens ainsi l'erreur "Invalid use of `\' in replacement text".

1 votes

Le Regexp devrait être "<\([^>]+\)>" et le remplacement ne fonctionne pas comme prévu si la chaîne de recherche correspond à une balise en majuscules.

0voto

ConfexianMJS Points 1251

Je me rends compte que cette question est ancienne, mais je viens de découvrir comment faire cela dans Emacs antes de version 22 (ma version est 21.3.1) sans avoir besoin de définir une fonction Lisp personnalisée : utiliser M-x query-replace-regexp-eval (mentionné en haut de la page cette page du wiki Emacs ) avec <\([^>]+\)> comme chaîne de recherche et (concat "<" (downcase \1) ">") pour le remplacer.

Cela devrait fonctionner avec toute chaîne de remplacement qui peut être définie comme une concaténation de parties, y compris les groupes capturés non modifiés par une quelconque fonction. Par exemple :

<BarFoo baz="Quux">

peuvent avoir juste le nom de la balise en minuscule :

<barfoo baz="Quux">

en utilisant la chaîne de recherche <\([A-Za-z]+\)\([^>]*\)> et remplacement (concat "<" (downcase \1) \2 ">") (qui fonctionne également sur l'exemple de l'OP qui ressemble à une balise sans attributs).

0voto

Xerus Points 427

En utilisant le mal, vous pouvez simplement faire :%s/<\([^>]+\)>/<\L\1>

\L est responsable de la mise en minuscule de toutes les lettres suivantes, cela devrait également fonctionner pour query-replace-regexp .

Je n'ai pas trouvé de documentation autour d'Emacs pour cela, mais cela semble correspondre à cette liste : https://www.boost.org/doc/libs/1_44_0/libs/regex/doc/html/boost_regex/format/perl_format.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X