Como procurar por uma das duas seqüências semelhantes no Vim?

29

No Vim, se eu quiser fazer uma pesquisa que corresponda a "planA" ou "planB", sei que posso fazer isso:

/plan[AB]

Isso funciona porque o regex permite A ou B como seu conjunto de caracteres.

Mas como posso especificar uma das duas seqüências completas? Por exemplo, "planetAwesome" ou "planetTerrible"?

Isso corresponderá a ambos, junto com "planetAnythingHereAsLongAsItsJustLetters":

planet\([a-zA-Z]*\)

Como posso corresponder apenas as strings que correspondem exatamente a "planetAwesome" ou "planetTerrible"?

Nathan Long
fonte
Na verdade, os colchetes criam uma classe de personagem. plan[ABC]corresponde planA, planBe planCigualmente bem.
Christopher Bottoms
@molsecules - certo, obrigado. Eu atualizei a pergunta.
Nathan Long

Respostas:

43
/planet\(Awesome\|Terrible\)

Para ver a documentação relevante, emitir :help /e role para baixo até a seção "A definição de um padrão".

Gilles 'SO- parar de ser mau'
fonte
1
Ah! Eu não estava escapando dos parênteses quando tentei isso. Interessante - eu pensei que só tinha que escapar de caracteres literais.
Nathan Long
1
@ Nathan: Vários mecanismos de regex têm regras diferentes sobre quais caracteres devem ser escapados para torná-los especiais vs. devem ser escapados para torná-los literais (por exemplo, POSIX BRE vs. ERE). Você pode ajustar os requisitos escapando no vim em uma base per-padrão, incluindo um dos escapes especiais: \m, \M, \v, ou\V . Também existe a 'magic'opção , mas geralmente é melhor deixá-la em paz, pois ela tem efeito global (a menos que seja substituída por uma das sinalizações acima).
Chris Johnsen
1
Usando muito mágica parece que isso:/\vplanet(Awesome|Terrible)
SergioAraujo
4

Para adicionar à resposta de Gilles, você pode adicionar algumas coisas:

/\<planet\(Awesome\|Terrible\)\>

\<marca o início de uma 'palavra' (essencialmente alfanumérica)
\>marca o fim de uma 'palavra' (essencialmente alfanumérica)

asoundmove
fonte