Comment échapper les caractères spéciaux regexp dans une chaîne?

9

Je compose une expression régulière complexe et l'utilisateur peut fournir une partie de l'expression. Cependant, la partie fournie par l'utilisateur doit être interprétée littéralement, c'est-à-dire que les caractères spéciaux regexp doivent être échappés. Existe-t-il une fonction pour échapper à ces caractères? Cela semble être une chose courante à faire, mais toute ma recherche sur Google a échoué.

Exemple:

(re-search-forward (format "\b%s\b" user-string))

Si user-stringc'est le cas test*case, je veux faire correspondre test*casemais pas testttttcase.

tmalsburg
la source

Réponses:

12

Vous pouvez utiliser regexp-quote:

Cette fonction renvoie une expression régulière dont la seule correspondance exacte est chaîne. L'utilisation de cette expression régulière dans la recherche ne réussira que si les caractères suivants du tampon sont des chaînes; son utilisation dans une fonction de recherche réussira si le texte recherché contient une chaîne.

(regexp-quote "^The cat$") => \\^The cat\\$

Dan
la source
1
Grand merci! Mais pourquoi était-ce si difficile à trouver? Parfois, la documentation d'Emacs me rend fou.
tmalsburg
2
Vous pouvez décrire ce que vous avez cherché et où vous vous attendiez à trouver sur cette fonction, avec Mx report-emacs-bug. Peut-être que la documentation fait défaut et devrait être corrigée.
YoungFrog
2
@tmalsburg Un mot clé utile serait "échapper". Peut-être (defalias 'regexp-escape 'regexp-quote). Cela a-t-il été discuté sur l'une des listes de diffusion emacs?
ebpa