Vim: Comment rechercher un mot qui n'est pas suivi d'un autre mot?
Question
Jolie question élémentaire, j'essaie d'écrire une expression rationnelle dans Vim pour qu'elle corresponde à toute phrase commençant par "abc "
directement suivie d'un élément autre que "defg"
.
J'ai utilisé "[^defg]"
pour rechercher tout caractère autre que d, e, f ou g.
Mon premier instinct a été d'essayer /abc [^\(defg\)]
ou /abc [^\<defg\>]
mais ni l'une ni l'autre de ces œuvres.
La solution
Voici la chaîne de recherche.
/abc \(defg\)\@!
Le concept que vous recherchez s'appelle une affirmation d'anticipation négative. Essayez ceci dans vim pour plus d’informations:
:help \@!
Autres conseils
précédé ou suivi par?
Si tout ce qui commence par 'abc' n'est pas (immédiatement) suivi de 'defg', vous voulez La solution de bmdhacks .
Si tout ce qui commence par "abc" n'est pas (immédiatement) précédé de "defg", vous souhaitez une vision négative:
/\%(defg\)\@<!abc /
Cela correspondra à toute occurrence de 'abc' tant qu'elle ne fait pas partie de 'defgabc'. Voir :help \@<!
pour plus de détails.
Si vous voulez faire correspondre "abc" tant qu'il ne fait pas partie de "defg. * abc", ajoutez simplement un .*
:
/\%(defg.*\)\@<!abc /
La correspondance de 'abc' uniquement sur les lignes où 'defg' ne se produit pas est similaire:
/\%(defg.*\)\@<!abc \%(.*defg\)\@!/
Bien que, si vous ne faites que cela pour une substitution, vous pouvez faciliter cela en combinant :v//
et :s//
:%v/defg/s/abc /<whatever>/g
Ceci remplacera "< quel que soit >" pour 'abc' sur toutes les lignes qui ne contiennent pas 'defg'. Voir :help :v
pour plus d'informations.
Voilà, c'est un poilu:
/\%(\%(.\{-}\)\@<=XXXXXX\zs\)*
(remplacez XXXXXX par le mot recherché). Cela recherchera tout ce qui ne ne contient pas XXXXXX. J'imagine que si tu le faisais:
/abc \%(\%(.\{-}\)\@<=defg\zs\)*
Cela peut fonctionner comme vous le souhaitez. J'espère que cela aide un peu!
/ abc \ [^ d] [^ e] [^ f] [^ g]
C'est assez lourd pour les gros mots, mais ça marche comme un charme.