Vim: Como faço para procurar uma palavra que não é seguido por outra palavra?
Pergunta
pergunta básica bonita, eu estou tentando escrever um regex no Vim para combinar com qualquer frase que começa com "abc "
diretamente seguido por outra coisa senão "defg"
.
Eu usei "[^defg]"
para corresponder a qualquer caractere único que não seja d, e, f ou g.
Meu primeiro instinto foi tentar /abc [^\(defg\)]
ou /abc [^\<defg\>]
mas nem uma daquelas obras.
Solução
Aqui está a seqüência de pesquisa.
/abc \(defg\)\@!
O conceito que você está procurando é chamado de afirmação look-ahead negativo. Tente isto no vim para mais informações:
:help \@!
Outras dicas
precedido ou seguido de?
Se é qualquer coisa que começa com 'abc' que não é (imediatamente), seguido por 'DefG', você quer bmdhacks solução .
Se é qualquer coisa que começa com 'abc' que não é (imediatamente) precedido por 'DefG', você quer um lookbehind negativo:
/\%(defg\)\@<!abc /
Este irá corresponder a qualquer ocorrência de 'abc', desde que ele não faz parte do 'defgabc'. Veja :help \@<!
para mais detalhes.
Se você deseja corresponder 'abc', desde que ele não é parte de, em seguida, basta adicionar um .*
'DefG * abc.':
/\%(defg.*\)\@<!abc /
Matching 'abc' apenas em linhas onde 'DefG' não ocorrer é semelhante:
/\%(defg.*\)\@<!abc \%(.*defg\)\@!/
Embora, se você está apenas fazendo isso para uma substituição, você pode tornar isso mais fácil, combinando :v//
e :s//
:%v/defg/s/abc /<whatever>/g
Isto irá substituir ':help :v
para mais.
Aqui vamos nós, este é um cabeludo:
/\%(\%(.\{-}\)\@<=XXXXXX\zs\)*
(substitua XXXXXX com a palavra de pesquisa). Isto irá procurar tudo o que faz não conter XXXXXX. I imagine se você fez:
/abc \%(\%(.\{-}\)\@<=defg\zs\)*
Isso pode funcionar como você deseja que ele. Espero que isso ajude um pouco!
/ abc \ [^ d] [^ e] [^ f] [^ g]
É muito complicado para as palavras maiores, mas funciona como um encanto.