Entonces, usando el generador de expresiones regulares (Mx re-builder), encontrar líneas que terminan en \ toma "\\ $", mientras que en la búsqueda y reemplazo por expresión regular, solo toma "\ $". Hubiera esperado que el generador de expresiones regulares construyera expresiones directamente utilizables, entonces, ¿qué explica esta diferencia?
elisp
regular-expressions
usuario2699
fuente
fuente
reb-query-replace
definición de la función.Respuestas:
En realidad, hay cuatro
re-builder
opciones de sintaxis diferentes , y puede cambiar entre ellas conC-cTABDos son para los compiladores de expresiones regulares sexp-form
rx
ysregex
(pero como el primero es más completo y casi totalmente compatible con la sintaxis, realmente puede ignorar sregex a menos que esté trabajando con el código antiguo que lo usó).Las otras dos opciones de sintaxis son
read
(la predeterminada) ystring
(que es la sintaxis que usa de forma interactiva).La
read
sintaxis es la sintaxis de 'código', es decir, tal como lo reconoce el lector de lisp, en la que se ingresa la expresión regular según la sintaxis de lectura para las cadenas :C-hig
(elisp) Syntax for Strings
RETLa
string
sintaxis (que siempre he considerado un nombre innecesariamente confuso en este contexto) es la sintaxis de una cadena de expresión regular que ya se ha leído y que, por lo tanto, no requiere que se escape ningún carácter al escribir la cadena. Es decir, esta es la sintaxis de expresión regular real , la misma que usa cuando Emacs le solicita interactivamente.Si desea utilizar la sintaxis de cadena de forma predeterminada, agregue lo siguiente a su archivo de inicio o use M-x
customize-option
RETreb-re-syntax
RETTenga en cuenta que puede alternar entre la sintaxis de lectura y cadena al editar la expresión regular, sin pérdida de datos. También puede cambiar de los formularios sexp a la sintaxis de lectura / cadena (naturalmente; compilar sexps en cadenas es para lo que sirven esas bibliotecas), pero no puede ir en la otra dirección y generar un sexp a partir de una cadena. re-builder recuerda cuál era el sexp, por lo que no pierde esa forma cuando cambia la sintaxis; pero tampoco se actualiza si modifica la expresión regular en una sintaxis diferente y luego cambia de nuevo. En resumen, si está creando la expresión regular como sexp, asegúrese de editarla solo mientras usa esa sintaxis.
Un problema con el
rx
soporte es que en realidad está usando larx-to-string
función, que no es exactamente idéntica a usar larx
macro en el código.rx
acepta un número arbitrario de argumentos de forma y los trata como una secuencia implícita , mientras querx-to-string
solo acepta una única forma, y cualquier secuencia de nivel superior debe hacerse explícita con'(sequence ...)
o equivalente.En resumen, cuando ingresa un formulario
'(...)
en el re-constructor, se procesa como(rx-to-string '(...))
y no(rx ...)
También tenga en cuenta que un formulario no válido puede hacer
re-builder
que deje de actualizar dinámicamente las coincidencias en el búfer asociado, incluso después de que el formulario vuelva a ser válido. El C-cC-uenlace parareb-force-update
es útil para resolver estas situaciones.Por defecto, la línea de modo muestra "RE Builder" cuando se usa
read
ostring
sintaxis, y "RE Builder Lisp" cuando se usarx
osregex
sintaxis, pero parece mucho más útil identificar la sintaxis específica en uso (especialmente para diferenciar entreread
ystring
).Si instala el
delight
paquete desde GNU ELPA, puede usar lo siguiente para agregar un indicador de sintaxis a la línea de modo.Esto cambia el nombre del modo a "Regexp [lectura]" en
read
sintaxis, y lo mismo para los demás.O para incluir una pista para el gotcha
rx
vsrx-to-string
descrito anteriormente, haga que la línea de modo diga "Regexp [rx-to-string]" cuando use larx
sintaxis:fuente