在vim中寻找精确匹配
使用在vim中寻找精确匹配,vim,Vim,使用/或?可以在vim中查找单词的匹配项。但是我怎样才能找到完全匹配的呢? 例如,我的文本包含以下单词:aaaaaaaa并且我键入/aa这将查找包含模式aa的所有字符串,但是如果我想准确地查找aa而不是aaaaaa?您可以搜索aa[^a],该怎么办,这将找到您的两个as,而没有其他内容 编辑:哦,孩子,你们都在追求一个精确的匹配:-)所以,要精确匹配两个aas,其他什么都不匹配: [^a]\zsaa\ze[^a]\|^\zsaa\ze$\|^\zsaa\ze[^a]\|[^a]\zsaa\ze$
/
或?
可以在vim中查找单词的匹配项。但是我怎样才能找到完全匹配的呢?
例如,我的文本包含以下单词:
aaaaaaaa
并且我键入/aa
这将查找包含模式aa的所有字符串,但是如果我想准确地查找aa
而不是aaaaaa
?您可以搜索aa[^a]
,该怎么办,这将找到您的两个a
s,而没有其他内容
编辑:哦,孩子,你们都在追求一个精确的匹配:-)所以,要精确匹配两个aa
s,其他什么都不匹配:
[^a]\zsaa\ze[^a]\|^\zsaa\ze$\|^\zsaa\ze[^a]\|[^a]\zsaa\ze$
分支机构也扩大了:
[^a]\zsaa\ze[^a]
\|^\zsaa\ze$
\|^\zsaa\ze[^a]
\|[^a]\zsaa\ze$
这些覆盖了所有意外事件--aa
s可以位于任何行的开头、中间或结尾。而且最多只能有两个a
s
表示实际匹配从这里开始\zs
表示实际匹配在此结束\ze
- 第一个分支在被其他字符包围的行中查找
aa
- 第二个分支在组成整行时查找
aa
- 第三个分支在行首找到
aa
- 第四个分支在一行的末尾找到
aa
编辑2:为了满足您的智力需求,请参阅@benjifisher简化的、更优雅的版本。您可以通过
\
中的\
将要查找的字符串括起来,以精确匹配该字符串。找到一个单独的aa
(不是a
,aaa
,…),您需要在前后都声明该字符不匹配。这是通过包含匹配本身(a\{2}
)的负向后查找(\@在Vim的正则表达式语法中)和向前查找(\@!
)完成的:
/\%(a\)\@
简化
这些断言很难键入,如果匹配项周围的边框也是非关键字/关键字边框,则可以使用较短的\
断言(如MosteM的回答),但这在一般情况下不起作用,例如使用xaax
将光标移到要搜索的确切单词
按*(Shitf+8或来自keybord的numpad)。这也将匹配aaaa
和aaa
末尾的aa,因此我给@MosteM的答案加1。如果没有字符跟随,例如在行尾,它将不起作用。这很有趣!首先,构造^\zs
和\ze$
比必要的复杂得多:使用^
和$
可以得到相同的结果。其次,我认为您可以使用\(^\[^a]\)\zsaa\ze\([^a]\\\\\\\$\)
保存一些字符。在这种情况下,你自己决定是否更容易阅读短文。@benjifisher-我向你超凡的智慧致敬。你的缩略版确实像广告上说的那样有效。我将保留我的最后一个正则表达式,因为它也完成了工作,是思考这个问题的一个很好的起点。但我也会给你的评论加上一个指针。这只在有关键词边框的情况下有效;例如,它将无法在xaax
中找到匹配项。哇,我没有意识到这一点!例如,键*
和#
也不起作用。我会使用aa
而不是a\{2}
。因为a
已经是一个(文字)原子,所以我不需要分组字符:/a\@。看看这个欺骗性的aaa
我可能会认为a\{2}
毕竟更清晰。这非常方便,但矛盾的是,它依赖于首先找到至少一个您试图找到的字符串实例。不过,对于快速定位重复项来说,这太棒了!
/\%(a\)\@<!a\{2}\%(a\)\@!/