o suporte para regex olha para trás e para a frente?

12

Preciso executar a substituição da consulta regex, de modo que

fooin foo baré correspondido, mas fooin foo baznão é. Normalmente, eu usaria regex antecipadamente, por exemplo foo(?=bar).

No entanto, parece que o Emacs não pode fazer isso? Vim parece capaz , mas o modo maligno no espaço não pode.

Heisenberg
fonte
Há também o seguinte: github.com/gamesun/emacs-regex-lookaround , mas eu não tentei criar com esse patch, e parece que já faz um tempo.
Wvxvw

Respostas:

10

Não, as expressões regulares do Emacs não suportam asserções arbitrárias de look-ahead / behind de largura zero.

Nota: Evil e Spacemacs (como todas as bibliotecas elisp) são irrelevantes quando se trata de perguntas sobre a implementação da linguagem Emacs Lisp.

phils
fonte
Então, é impossível substituir foono foobar, mas não em foobaz? Esta é uma operação bastante comum que eu pensei que deveria haver uma solução. Talvez olhar para frente e para trás seja a abordagem errada?
Heisenberg
Isso não é estritamente equivalente, mas a substituição foo\(bar\)por baz\1será suficiente em todos os casos em barque não tiverem mais correspondências.
Phll
Se você estiver escrevendo elisp, terá muita flexibilidade e, se estiver substituindo interativamente, poderá invocar o elisp arbitrário durante as substituições; portanto, em última análise, existem maneiras de fazer essas coisas. Não é tão conveniente quanto você pode fazer com essas afirmações.
Phll
por exemplo: substituir foopor \,(if (looking-at "bar") "baz" \&)substituirá foopor bazse o texto a seguir for bar(e substitua foopor foooutro). O que ainda não é a mesma coisa que apenas corresponder foo quando é seguido por bar, mas é outra opção.
Phll
Eu acho que isso é como o que você disse acima, mas parece que você pode digitar: CSM-% foo \ (bar \) RET FOO \ 1 RET para substituir toda a barra de foo pela barra de FOO, mas deixe todo o foo baz sozinho. Está faltando alguma coisa que você queria?
John Kitchin 14/05