Vim: How do I search for a word which is not followed by another word?

后端 未结 4 1726
北恋
北恋 2020-12-23 14:09

Pretty basic question, I\'m trying to write a regex in Vim to match any phrase starting with \"abc \" directly followed by anything other than \"defg\"

相关标签:
4条回答
  • 2020-12-23 14:23

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

    It's pretty cumbersome for larger words, but works like a charm.

    0 讨论(0)
  • 2020-12-23 14:28

    Here we go, this is a hairy one:

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

    (replace XXXXXX with the search word). This will search for everything that does not contain XXXXXX. I imagine if you did:

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

    This may work like you want it to. Hope this helps a little!

    0 讨论(0)
  • 2020-12-23 14:35

    Here's the search string.

    /abc \(defg\)\@!
    

    The concept you're looking for is called a negative look-ahead assertion. Try this in vim for more info:

    :help \@!
    
    0 讨论(0)
  • 2020-12-23 14:37

    preceeded or followed by?

    If it's anything starting with 'abc ' that's not (immediately) followed by 'defg', you want bmdhacks' solution.

    If it's anything starting with 'abc ' that's not (immediately) preceeded by 'defg', you want a negative lookbehind:

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

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

    If you want to match 'abc ' as long as it's not part of 'defg.*abc ', then just add a .*:

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

    Matching 'abc ' only on lines where 'defg' doesn't occur is similar:

    /\%(defg.*\)\@<!abc \%(.*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 /<whatever>/g
    

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

    0 讨论(0)
提交回复
热议问题