Finding exact match in vim

后端 未结 4 1886
春和景丽
春和景丽 2021-02-02 16:26

Using / or ? enables to find a match for a word in vim. But how can I find an exact match? For example, my text contains the following words: a a

4条回答
  •  无人及你
    2021-02-02 16:47

    You can search for aa[^a], which will find your two as and nothing else.

    EDIT: oh boy, y'all are after an exact match :-) So, to match exactly two aas and nothing else:

    [^a]\zsaa\ze[^a]\|^\zsaa\ze$\|^\zsaa\ze[^a]\|[^a]\zsaa\ze$
    

    And the branches expanded out:

      [^a]\zsaa\ze[^a]
    \|^\zsaa\ze$
    \|^\zsaa\ze[^a]
    \|[^a]\zsaa\ze$
    

    These cover all contingencies--the aas can be at the beginning, the middle, or the end of any line. And there can't be more than two as together.

    • \zs means the actual match starts here
    • \ze means the actual match ends here
    • the first branch finds aa in a line surrounded by other characters
    • the second branch finds aa when it makes up the whole line
    • the third branch finds aa at the beginning of a line
    • and the fourth branch finds aa at the end of a line.

    My mind boggles at fancy things like look-behind assertions, so I tried to stick to reasonably simple regex concepts.

    EDIT 2: see @benjifisher's simplified, more elegant version below for your intellectual pleasure.

提交回复
热议问题