Vim: Como excluo uma palavra inteira da minha pesquisa?

Questão básica, estou tentando escrever um regex no Vim para combinar qualquer frase que comece com "abc" diretamente seguida por qualquer coisa que não seja "defg" .

Eu usei "[^ defg]" para combinar com qualquer caractere diferente de d, e, f ou g.

My first instinct was to try /abc [^\(defg\)] or /abc [^\] but neither one of those works.

0
quer dizer precedido? ou seguido por? Seus exemplos parecem implicar seguido por.
adicionado o autor rampion, fonte

4 Respostas

precedido ou seguido por?

Se é algo que começa com 'abc' que não é (imediatamente) seguido por 'defg', você quer solução bmdhacks" .

Se é algo começando com 'abc' que não é (imediatamente) precedido por 'defg', você quer um lookbehind negativo:

/\%(defg\)\@

This will match any occurance of 'abc ' as long as it's not part of 'defgabc '. See :help \@ for more details.

Se você quiser combinar 'abc', desde que não faça parte de 'defg. * Abc', basta adicionar um . * :

/\%(defg.*\)\@

Corresponder 'abc' apenas nas linhas em que 'defg' não ocorre é semelhante:

/\%(defg.*\)\@

Although, if you're just doing this for a substitution, you can make this easier by combining :v// and :s//

:%v/defg/s/abc //g

This will substitute '' for 'abc ' on all lines that don't contain 'defg'. See :help :v for more.

0
adicionado

Aqui vamos nós, este é peludo:

/\%(\%(.\{-}\)\@<=XXXXXX\zs\)*

(substitua XXXXXX pela palavra de pesquisa). Isso irá procurar por tudo que não contiver XXXXXX. Eu imagino se você fez:

/abc \%(\%(.\{-}\)\@<=defg\zs\)*

Isso pode funcionar como você quer. Espero que isto ajude um pouco!

0
adicionado

/ abc \ [^ d] [^ e] [^ f] [^ g]

É bastante complicado para palavras maiores, mas funciona como um encanto.

0
adicionado
Isso também não combina com "abc daaa"?
adicionado o autor Paul Tomblin, fonte

Aqui está a string de pesquisa.

/abc \(defg\)\@!

O conceito que você está procurando é chamado de afirmação negativa de look-ahead. Tente isso no vim para mais informações:

:help \@!
0
adicionado
+1 Eu tive essa pergunta por um tempo. Eu marcaria seu comentário como spam se não tivesse medo de prejudicar seu representante.
adicionado o autor xdhmoore, fonte
Para o registro, eu sou um usuário do emacs :-)
adicionado o autor bmdhacks, fonte