2008-09-18 13 views
31

Pregunta bastante básica, estoy tratando de escribir una expresión regular en Vim para que coincida con cualquier frase que comience por "abc " seguida directamente por cualquier cosa que no sea "defg".Vim: ¿Cómo excluyo una palabra completa de mi búsqueda?

He usado "[^defg]" para que coincida con cualquier otro carácter que no sean d, e, fe g.

Mi primer instinto fue probar /abc [^\(defg\)] o /abc [^\<defg\>] pero ninguno de esos funciona.

+0

¿te refieres a precedido? o seguido por? Sus ejemplos parecen implicar seguido por. – rampion

Respuesta

39

Aquí está la cadena de búsqueda.

/abc \(defg\)\@! 

El concepto que está buscando se denomina afirmación de anticipación negativa. Pruebe esto en vim para obtener más información:

:help \@! 
+0

Para el registro, soy un usuario de emacs :-) – bmdhacks

+1

+1 He tenido esta pregunta por un tiempo. Marcaría tu comentario como correo no deseado si no temiera que perjudicara a tu representante. – xdhmoore

0

Aquí vamos, esta es una peluda uno:

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

(sustituir XXXXXX con la palabra de búsqueda). Esto buscará todo lo que haga que no contenga XXXXXX. Imagino que si lo hizo:

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

Esto puede funcionar como usted lo desea. ¡Espero que esto ayude un poco!

-4

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

Es bastante engorroso para las palabras más grandes, pero funciona como un encanto.

+1

¿No coincidirá eso también con "abc daaa"? –

14

precedido o seguido de?

Si es algo que comienza con 'abc' que no es (inmediatamente) seguido de 'defg', quiere bmdhacks' solution.

Si es algo que empiezan con 'abc' eso no es (inmediatamente) precedido por 'defg', que desea una búsqueda hacia atrás negativo:

/\%(defg\)\@<!abc/

Esto coincidirá con cualquier ocurrencia de 'abc', siempre y cuando no sea parte de 'defgabc'. Vea :help \@<! para más detalles.

Si desea hacer coincidir 'abc', siempre y cuando no sea parte de, a continuación, sólo tiene que añadir un .* 'defg * abc.':

/\%(defg.*\)\@<!abc/

Matching 'abc' sólo en líneas donde 'defg' no se produce es similar:

/\%(defg.*\)\@<!abc \%(.*defg\)\@!/ 

Aunque, si sólo está haciendo esto para hacer un cambio, usted puede hacer esto más fácil mediante la combinación de :v// y :s//

:%v/defg/s/abc /<whatever>/g 

Esto sustituirá '< cualquiera>' por 'abc' en todas las líneas que no contengan 'defg'. Vea :help :v para más.

Cuestiones relacionadas