Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.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_Full Text Search - Fatal编程技术网

Vim 如何在同一行中搜索同一单词的多个重叠出现?

Vim 如何在同一行中搜索同一单词的多个重叠出现?,vim,full-text-search,Vim,Full Text Search,我想搜索同一行中出现的所有单词以及给定文件中的多个文件。例如: ABCCG*CAT*AD*CAT*TT DFGBBB*CAT*YYUAB ABCCG*TNTNT*ADCATDD DFGBBB*TNT*YYUAB 手动搜索单词'CAT'我在使用/CAT时发现了两个,而实际上该单词在文件中出现了三次 无论给定单词在一行中可能出现多次,查找文件中所有出现的单词的命令是什么 注意:文件中没有*。我在上面的示例中使用它来表示字符串CAT的位置 如果多个引用在同一条线上重叠会怎样?例如: ABCCG*C

我想搜索同一行中出现的所有单词以及给定文件中的多个文件。例如:

ABCCG*CAT*AD*CAT*TT
DFGBBB*CAT*YYUAB
ABCCG*TNTNT*ADCATDD
DFGBBB*TNT*YYUAB
手动搜索单词
'CAT'
我在使用
/CAT
时发现了两个,而实际上该单词在文件中出现了三次

无论给定单词在一行中可能出现多次,查找文件中所有出现的单词的命令是什么

注意:文件中没有
*
。我在上面的示例中使用它来表示字符串
CAT
的位置

如果多个引用在同一条线上重叠会怎样?例如:

ABCCG*CAT*AD*CAT*TT
DFGBBB*CAT*YYUAB
ABCCG*TNTNT*ADCATDD
DFGBBB*TNT*YYUAB
使用
:%s/TNT//gn
搜索单词
TNT
,仍然会得到2,而实际上有三次出现


有没有一种方法可以使用Vim识别同一行中的重叠事件?

要获得一个项目(包括“重叠”字符串大小写)的所有匹配总数,您实际上需要使用
%s
命令(长格式:
%substitute
)并告诉它三件事:

  • 不要实际执行替换(
    n
    标志;在本例中,我猜是“noop”的助记符)
  • 将同一行上的多个匹配视为单独的匹配(
    g
    标志表示“全局”)
  • 做一个“非贪婪”匹配(
    \{-}
    ;有点神秘,但值得一读;见下文)
综上所述,它看起来是这样的:

:%s/[T]\{-}NT//gn
因此,鉴于问题的以下文本:

ABCCG*TNTNT*ADCATDD
DFGBBB*TNT*YYUAB
…然后vim将报告以下情况:

3 matches on 2 lines

如果/当您确实想要只计算匹配行的数量时,您可以省略
g
,vim将使用其默认值,只报告包含匹配行的数量行的数量。如果您不想计算“重叠”字符串,则省略
\{-}
部分


vim文档实际上有关于这些东西的非常好的信息。 有关在vim中计算项目的更多帮助,请参阅
:help count items

计算单词、行等。计算项目
要计算任何模式在当前缓冲区中出现的频率,请使用替换
命令并添加“n”标志以避免替换。报告的编号
替换的数量是项目的数量。示例:
:%s//&/gn个字符
:%s/\i\+/&/gn单词
:%s/^//n行
:%s/the/&/gn“the”任意位置
:%s/\/&/gn“the”作为一个单词
您可能需要重置“hlsearch”或执行“:nohlsearch”。
如果不希望在没有匹配项时出错,请添加“e”标志。
有关执行“非贪婪”匹配的更多帮助,请参见
:help non-greedy

                                                        non-greedy
If a "-" appears immediately after the "{", then a shortest match
first algorithm is used (see example below).  In particular, "\{-}" is
the same as "*" but uses the shortest match first algorithm.  BUT: A
match that starts earlier is preferred over a shorter match: "a\{-}b"
matches "aaab" in "xaaab".

Example                 matches
ab\{2,3}c               "abbc" or "abbbc"
a\{5}                   "aaaaa"
ab\{2,}c                "abbc", "abbbc", "abbbbc", etc.
ab\{,3}c                "ac", "abc", "abbc" or "abbbc"
a[bc]\{3}d              "abbbd", "abbcd", "acbcd", "acccd", etc.
a\(bc\)\{1,2}d          "abcd" or "abcbcd"
a[bc]\{-}[cd]           "abc" in "abcd"
a[bc]*[cd]              "abcd" in "abcd"

The } may optionally be preceded with a backslash: \{n,m\}.

你使用什么搜索插件作为默认搜索不会给出一个计数,并且假设在一个
CAT的
中没有任何控制字符,那么就会找到所有3I。我对我的问题进行了修改。我实际上也打算针对多个重叠出现。在vim中有什么方法可以做到这一点吗?(在我的问题中包括另一个例子)啊,是的,好的,这也很简单。你需要告诉vim做一个非贪婪的搜索;类似于
:%s/TNT\{-}//gn
的东西应该可以工作。我将修改我的答案以包含它。@Hello_PG所以,为这个案例找到正确的非贪婪匹配比我想象的要简单;我意识到我的天真
:%s/TNT\{}//gn
也将匹配
TN
,这是我们不想要的,所以我将它细化为
:%s/[t]\{-}NT//gn
,在这种情况下,它应该会提供您想要的内容。(我希望有时间在这里进一步详细说明为什么这样做,但我认为这确实应该是您需要的。)@您好,顺便说一句,这是一个经过投票表决的好问题。我希望答案和问题最终对StackOverflow的其他人有用。@您好,这就是为什么StackOverflow问题应该总是陈述确切的真实案例,而不是假设的案例。因此,请将该
CTCTCTC…
案例作为您问题的更新发布。或者更确切地说,发布到无效更多来回,请尝试发布您想要匹配的实际字符串(如果
CTC…
one不是实际字符串;您在这里说“如”,所以我不确定).&当然,也请尝试发布一段您希望在其中搜索的实际文本。&当我有更多时间时,我将回顾并再次回答(如果当时其他人还没有发布后续答案)。