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?

Daniel
fonte

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/
Brian Carper
fonte
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