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.