Soporte para regex mirar hacia atrás y hacia adelante?

12

Necesito realizar una regex query replace, de modo que

fooen foo barcoincide, pero fooen foo bazno. Normalmente usaría regex mirar hacia adelante, por ejemplo foo(?=bar).

Sin embargo, ¿parece que Emacs no puede hacer esto? Vim parece capaz , pero el modo malvado en los spacemacs no puede.

Heisenberg
fuente
También hay esto: github.com/gamesun/emacs-regex-lookaround , pero no intenté construir con este parche, y parece que ha pasado un tiempo.
wvxvw

Respuestas:

10

No, las expresiones regulares de Emacs no admiten aserciones arbitrarias de anticipación / retroceso de ancho cero.

nb Evil y Spacemacs (como todas las bibliotecas de elisp) son irrelevantes cuando se trata de preguntas sobre la implementación del lenguaje Emacs Lisp.

phils
fuente
Por lo que es imposible de reemplazar fooen foobarpero no en foobaz? Esta es una operación bastante común que pensé que debía haber una solución. ¿Quizás mirar hacia adelante y hacia atrás es el enfoque equivocado?
Heisenberg
Esto no es estrictamente equivalente, pero sustituyendo foo\(bar\)con baz\1será suficiente en todos los casos en que barno contenía más partidos.
phils
Si está escribiendo elisp, tiene mucha flexibilidad, y si está reemplazando interactivamente puede invocar elisp arbitrario durante los reemplazos, por lo que, en última instancia, hay formas de hacer estas cosas. Simplemente no tan convenientemente como lo haría con esas afirmaciones.
phils
por ejemplo: reemplazar foocon \,(if (looking-at "bar") "baz" \&)reemplazará foocon bazsi el siguiente texto es bar(y reemplazar foocon lo foocontrario). Que todavía no es lo mismo que solo coincidir foo cuando es seguido bar, pero es otra opción.
Phil
Supongo que esto es como lo que dijiste anteriormente, pero parece que puedes escribir: CSM-% foo \ (bar \) RET FOO \ 1 RET para reemplazar toda la barra de foo con la barra de FOO, pero deja todo foo baz solo. ¿Te falta algo que querías?
John Kitchin