Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在vim中寻找精确匹配_Vim - Fatal编程技术网

在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
我的头脑对诸如lookbehind断言之类的花哨事物感到困惑,所以我试图坚持使用合理简单的正则表达式概念


编辑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\)\@!/