Âncoras "Zoom"
Além da resposta do @ jecxjo, há muitas situações em que você pode usar as âncoras de largura zero \zs
e \ze
não a busca positiva. Essas âncoras definem o início ( \zs
) e o final ( \ze
) da correspondência dentro do padrão completo.
Exemplos
foo\zsbar
corresponderá bar
precedido por foo
( foo
não faz parte da correspondência)
foo\zebar
corresponderá foo
seguido por bar
( bar
não faz parte do jogo)
myFunction(\zs.*\ze)
corresponderá aos parâmetros em uma chamada de função (para fins de demonstração, não estou focando na correspondência gananciosa versus não gananciosa)
Colocando em uso
Eles se tornam mais úteis ao usar o :substitute
comando Por exemplo, digamos que eu queira substituir os parâmetros em uma chamada de função myFunction()
por foo
:
:%s/myFunction(\zs.*\ze)/foo/
Isso vai deixar myFunction(
e )
intacto, e você não precisa se preocupar com a captura-los em seu padrão ou repeti-las em sua substituição .
Você pode fazer isso usando o recurso de aparência regular do regex do Vim, mas é bastante desajeitado:
:%s/\(myFunction(\)\@<=.*\()\)\@=/foo/
(Acho que essa sintaxe faz com que eu esqueça o que estava tentando fazer em primeiro lugar.)
Você ainda precisa olhar às vezes
Ainda existem situações em que você precisa de atenção. Usando \zs
e \ze
são ótimos para situações simples em que você tem algo antes seguido de texto para combinar seguido por algo depois . Mas se for mais complexo que isso, você provavelmente terá que se ater à sintaxe mais pesada da aparência.
Fato engraçado
Embora sejam consideravelmente mais feias, a aparência do Vim é mais poderosa do que as do PCRE! Eles suportam lookbehind negativo de comprimento variável, o que significa que você pode afirmar que algum padrão cujo comprimento não é predeterminado não está antes da sua correspondência.
O PCRE não suporta isso, pois é bastante computacionalmente caro. Isso não é uma grande preocupação no Vim, pois os casos de uso mais comuns de regex tendem a envolver a pesquisa interativa, onde o tempo de computação é quase imperceptível para o usuário. Você provavelmente notaria se fosse usado para destacar a sintaxe.
Tópicos de ajuda relevantes
:help \zs
:help \ze
:help perl-patterns
Parece que isso é possível. Existe uma tabela simples para ir do perl ao vim.
:h perl-patterns
Por exemplo, se você possui a string
one two three
e deseja corresponderone
apenas se a<space>two
segue, pode usarIsso é semelhante à versão perl
fonte