Suporte a regex multilinha no Vim


116

Percebo que a sintaxe regex padrão para correspondência em várias linhas é usar / s, assim:

This is\nsome text
/This.*text/s

Isso funciona em Perl, por exemplo, mas não parece ser compatível com o Vim. Em vez disso, tenho que ser muito mais específico:

/This[^\r\n]*[\r\n]*text/

Não consigo encontrar nenhuma razão para isso, então estou pensando que provavelmente perdi as partes relevantes da ajuda do vim.

Alguém pode confirmar esse comportamento de uma forma ou de outra?

Respostas:


176

Sim, o //smodificador de Perl não está disponível em regexes do Vim. Veja :h perl-patternspara detalhes e uma lista de outras diferenças entre regexes Vim e Perl.

Em vez disso, você pode usar \_., o que significa "corresponder a qualquer caractere único, incluindo nova linha". É um pouco mais curto do que você. Veja :h /\_..

/This\_.*text/

4
Legal - minha vida ficou um pouco mais fácil. Eu estava fazendo (. | \ N) *
ojrac

2
O que faz a barra :h /\_.? Quer dizer, eu sei que funciona, mas por que :h /\_.funciona e não funciona :h \_.?
Editado em

2
@Eddified a barra (que é a chave padrão para pesquisa) especifica o contexto do \_.qual você pode ler como: me dê ajuda para a expressão de pesquisa \_.
Florian

No entanto, parece que não posso realizar a correspondência preguiçosa com esta expressão, mesmo se eu incluí-la entre parênteses. Há alguma forma de fazer isso?
xji

2
@JIXiang Para uma partida preguiçosa foo bar \n foo baz \n foo, experimente/foo\_.\{-}foo
James M. Lay
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.