supporto per regex guardare dietro e avanti?


12

Devo eseguire la sostituzione della query regex in modo tale

fooin foo barè abbinato, ma fooin foo baznon lo è. Normalmente userei regex guardare avanti, ad es foo(?=bar).

Tuttavia, sembra che Emacs non possa farlo? Vim sembra capace , ma la modalità malvagia nei veicoli spaziali non può.


C'è anche questo: github.com/gamesun/emacs-regex-lookaround , ma non ho provato a costruire con questa patch, e sembra che sia passato un po 'di tempo.
wvxvw,

Risposte:


10

No, le espressioni regolari di Emacs non supportano asserzioni arbitrarie di larghezza zero zero / dietro.

nb Evil e Spacemacs (come tutte le librerie elisp) sono irrilevanti quando si tratta di domande sull'implementazione del linguaggio Emacs Lisp.


Quindi è impossibile sostituire fooin foobarma non in foobaz? Questa è un'operazione abbastanza comune che pensavo ci dovesse essere una soluzione. Forse guardare avanti e indietro è l'approccio sbagliato?
Heisenberg

Questo non è strettamente equivalente, ma la sostituzione foo\(bar\)con baz\1sarà sufficiente in tutti i casi in cui barnon fossero presenti ulteriori corrispondenze.
phils,

Se scrivi elisp, hai molta flessibilità e se stai sostituendo interattivamente puoi invocare elisp arbitrario durante le sostituzioni, quindi alla fine ci sono modi per fare queste cose. Semplicemente non come potresti fare con quelle affermazioni.
phils

es: la sostituzione foocon \,(if (looking-at "bar") "baz" \&)sostituirà foocon bazse il seguente testo è bar(e sostituisce foocon fooaltrimenti). Che non è ancora la stessa cosa della corrispondenza solo fooquando è seguito da bar, ma è un'altra opzione.
phils

Immagino che sia come quello che hai detto sopra, ma sembra che tu possa digitare: CSM-% foo \ (bar \) RET FOO \ 1 RET per sostituire tutte le foo bar con FOO bar, ma lascia tutto solo foo baz. Ti manca qualcosa che volevi?
John Kitchin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.