regexp - probar expresiones regulares
Emacs: las expresiones regulares en Lisp necesitan escaparse por partida doble, ¿por qué? (4)
Es porque necesitas escapar de las barras diagonales inversas en cadenas. Si no escapa de la barra invertida de / (en la cadena resulta ser justo
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 cuando se escribe código lisp (¡pero no cuando se usa query-replace-regexp de forma interactiva!).
Entonces, por ejemplo, usando query-replace-regexp de manera interactiva puede usar
^/(.*/)[/t]-.*$
pero al escribir el código de elisp necesitas escaparte por partida doble de la siguiente manera:
^//(.*//)[/t]-.*$
Finalmente encontré una referencia a esto en un artículo de Steve Yegge, pero me preguntaba si alguien sabía por qué era esto.
Ya tiene la respuesta, pero un asistente integrado para crear expresiones regulares dentro de Emacs es un generador de nueva creación.
M-x re-builder
FWIW, emacs-lisp-mode
creará las expresiones especiales (como //(
y //)
para usted. Puede cambiar las caras para que sean algo que se destaca.
(Son font-lock-regexp-grouping-construct
y font-lock-regexp-grouping-backslash
)
scottfrazier es correcto, un escape se analiza cuando se lee la cadena, otro se analiza al crear la expresión regular. Es bastante fácil de recordar, pero puede convertirse en un problema, especialmente cuando intentas hacer coincidir una barra diagonal inversa ''/'. Usted termina teniendo que hacerlo cuatro veces ''////' porque tiene que hacer una doble barra para hacer coincidir la barra en el análisis de cadena inicial y el análisis de expresión regular.
Y cuando escribe sobre Desbordamiento de pila sobre este problema, tiene que usar 8 barras, porque la marca también usa la barra para un carácter de escape.