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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.