2009-02-11 20 views
22

He estado jugando con emacs lisp, y quería escribir una pequeña función para buscar y reemplazar una expresión regular. Me costó bastante conseguir que la expresión regular funcione correctamente porque no me di cuenta de que todos los caracteres especiales deben tener doble escape al escribir código lisp (¡pero no cuando se usa query-replace-regexp de forma interactiva!).Emacs: las expresiones regulares en Lisp necesitan escaparse por dos veces, ¿por qué?

Así, por ejemplo, el uso de query-replace-regexp interactiva puede utilizar

^\(.*\)[\t]-.*$ 

pero al escribir código elisp que necesitas escapar de todo lo que de este modo:

^\\(.*\\)[\t]-.*$ 

que finalmente encontró una referencia a esto en un Steve Yegge article, pero me preguntaba si alguien sabía por qué es esto?

Respuesta

21

Es porque necesita escapar de las barras diagonales inversas en cadenas. Si no se salta la barra invertida de \ (en la cadena resulta ser justo (

+0

Dang, la cosa de escape de barra invertida acaba de recibirme cuando publiqué :) tuve que poner \\\\\ (para hacerlo bien – scottfrazer

+0

Ok, eso tiene sentido. ¡Gracias! –

+2

Lo mismo es t laur de cualquier idioma que no tenga soporte sintáctico directo para las expresiones regulares y las construya a través de cadenas literales (por ejemplo, Java, Javascript), ¿verdad? –

8

scottfrazier es correcto, un escape se analiza cuando se lee la cadena, otro se analiza al crear la expresión regular. Es bastante es fácil de recordar, pero puede convertirse en un problema, especialmente cuando intentas hacer coincidir una barra diagonal inversa literal '\'. Terminas teniendo que hacerlo cuatro veces '\\\\' porque tienes que hacer una doble barra para que coincida la barra, tanto en la cadena de análisis inicial y el análisis sintáctico de expresiones regulares.

y cuando se escribe desbordamiento de pila de este problema tiene que usar 8 slashes porque rebaja utiliza la barra de un carácter de escape también.

18

Ya tiene la respuesta, pero un asistente integrado para crear expresiones regulares dentro de Emacs es un nuevo generador.

M-x re-builder 
+0

Impresionante, no sabía de eso. La próxima vez que haga esto debería ir mucho mejor. Gracias :). –

7

Fwiw, emacs-lisp-mode se fontify las expresiones especiales (como \\( y \\) para usted. A continuación, puede cambiar las caras a ser algo que se destaca.

(Son font-lock-regexp-grouping-construct y font-lock-regexp-grouping-backslash)

Cuestiones relacionadas