¿Cómo escapar de caracteres especiales regexp en una cadena?

9

Estoy componiendo una expresión regular compleja y el usuario puede proporcionar una parte de la expresión. Sin embargo, la parte suministrada por el usuario debe interpretarse literalmente, es decir, se deben escapar los caracteres especiales regexp. ¿Hay una función para escapar de estos personajes? Parece algo común, pero no busqué en Google.

Ejemplo:

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

Si user-stringes así test*case, quiero coincidir test*casepero no testttttcase.

Tmalsburg
fuente

Respuestas:

12

Puedes usar regexp-quote:

Esta función devuelve una expresión regular cuya única coincidencia exacta es una cadena. El uso de esta expresión regular en mirar solo tendrá éxito si los siguientes caracteres en el búfer son cadenas; usarlo en una función de búsqueda tendrá éxito si el texto que se busca contiene una cadena.

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

Dan
fuente
1
¡Muchas gracias! ¿Pero por qué fue tan difícil de encontrar? A veces la documentación de Emacs me vuelve loco.
Tmalsburg
2
Puede describir lo que buscó y dónde esperaba encontrar esta función, con Mx report-emacs-bug. Quizás falta la documentación y debería repararse.
YoungFrog
2
@tmalsburg Una palabra clave útil sería "escapar". Tal vez (defalias 'regexp-escape 'regexp-quote). ¿Se discutió esto en alguna de las listas de correo de emacs?
ebpa